aboutsummaryrefslogtreecommitdiffstats
path: root/testing/asterisk/asterisk-07-issue14068.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/asterisk/asterisk-07-issue14068.patch')
-rw-r--r--testing/asterisk/asterisk-07-issue14068.patch1423
1 files changed, 0 insertions, 1423 deletions
diff --git a/testing/asterisk/asterisk-07-issue14068.patch b/testing/asterisk/asterisk-07-issue14068.patch
deleted file mode 100644
index 49cad1681b..0000000000
--- a/testing/asterisk/asterisk-07-issue14068.patch
+++ /dev/null
@@ -1,1423 +0,0 @@
-Index: channels/chan_dahdi.c
-===================================================================
---- a/channels/chan_dahdi.c (.../trunk) (revision 186562)
-+++ b/channels/chan_dahdi.c (.../team/group/issue14068) (revision 186562)
-@@ -3096,6 +3096,196 @@
- }
- #endif /* defined(HAVE_SS7) */
-
-+#if defined(HAVE_PRI)
-+static enum AST_REDIRECTING_REASON pri_to_ast_reason(int pri_reason)
-+{
-+ enum AST_REDIRECTING_REASON ast_reason;
-+
-+ switch (pri_reason) {
-+ case PRI_REDIR_FORWARD_ON_BUSY:
-+ ast_reason = AST_REDIRECTING_REASON_USER_BUSY;
-+ break;
-+ case PRI_REDIR_FORWARD_ON_NO_REPLY:
-+ ast_reason = AST_REDIRECTING_REASON_NO_ANSWER;
-+ break;
-+ case PRI_REDIR_DEFLECTION:
-+ ast_reason = AST_REDIRECTING_REASON_DEFLECTION;
-+ break;
-+ case PRI_REDIR_UNCONDITIONAL:
-+ ast_reason = AST_REDIRECTING_REASON_UNCONDITIONAL;
-+ break;
-+ case PRI_REDIR_UNKNOWN:
-+ default:
-+ ast_reason = AST_REDIRECTING_REASON_UNKNOWN;
-+ break;
-+ } /* end switch */
-+
-+ return ast_reason;
-+}
-+#endif /* defined(HAVE_PRI) */
-+
-+#if defined(HAVE_PRI)
-+static int ast_to_pri_reason(enum AST_REDIRECTING_REASON ast_reason)
-+{
-+ int pri_reason;
-+
-+ switch (ast_reason) {
-+ case AST_REDIRECTING_REASON_USER_BUSY:
-+ pri_reason = PRI_REDIR_FORWARD_ON_BUSY;
-+ break;
-+ case AST_REDIRECTING_REASON_NO_ANSWER:
-+ pri_reason = PRI_REDIR_FORWARD_ON_NO_REPLY;
-+ break;
-+ case AST_REDIRECTING_REASON_UNCONDITIONAL:
-+ pri_reason = PRI_REDIR_UNCONDITIONAL;
-+ break;
-+ case AST_REDIRECTING_REASON_DEFLECTION:
-+ pri_reason = PRI_REDIR_DEFLECTION;
-+ break;
-+ case AST_REDIRECTING_REASON_UNKNOWN:
-+ default:
-+ pri_reason = PRI_REDIR_UNKNOWN;
-+ break;
-+ } /* end switch */
-+
-+ return pri_reason;
-+}
-+#endif /* defined(HAVE_PRI) */
-+
-+#if defined(HAVE_PRI)
-+static int pri_to_ast_presentation(int pri_presentation)
-+{
-+ int ast_presentation;
-+
-+ switch (pri_presentation) {
-+ case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
-+ ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
-+ break;
-+ case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
-+ ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
-+ break;
-+ case PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
-+ ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
-+ break;
-+ case PRES_ALLOWED_NETWORK_NUMBER:
-+ ast_presentation = AST_PRES_ALLOWED_NETWORK_NUMBER;
-+ break;
-+ case PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
-+ ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
-+ break;
-+ case PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
-+ ast_presentation = AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
-+ break;
-+ case PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
-+ ast_presentation = AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
-+ break;
-+ case PRES_PROHIB_NETWORK_NUMBER:
-+ ast_presentation = AST_PRES_PROHIB_NETWORK_NUMBER;
-+ break;
-+ case PRES_NUMBER_NOT_AVAILABLE:
-+ ast_presentation = AST_PRES_NUMBER_NOT_AVAILABLE;
-+ break;
-+ default:
-+ ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED; /* ?? */
-+ break;
-+ } /* end switch */
-+
-+ return ast_presentation;
-+}
-+#endif /* defined(HAVE_PRI) */
-+
-+#if defined(HAVE_PRI)
-+static int ast_to_pri_presentation(int ast_presentation)
-+{
-+ int pri_presentation;
-+
-+ switch (ast_presentation) {
-+ case AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
-+ pri_presentation = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
-+ break;
-+ case AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
-+ pri_presentation = PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
-+ break;
-+ case AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
-+ pri_presentation = PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
-+ break;
-+ case AST_PRES_ALLOWED_NETWORK_NUMBER:
-+ pri_presentation = PRES_ALLOWED_NETWORK_NUMBER;
-+ break;
-+ case AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
-+ pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
-+ break;
-+ case AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
-+ pri_presentation = PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
-+ break;
-+ case AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
-+ pri_presentation = PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
-+ break;
-+ case AST_PRES_PROHIB_NETWORK_NUMBER:
-+ pri_presentation = PRES_PROHIB_NETWORK_NUMBER;
-+ break;
-+ case AST_PRES_NUMBER_NOT_AVAILABLE:
-+ pri_presentation = PRES_NUMBER_NOT_AVAILABLE;
-+ break;
-+ default:
-+ pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED; /* ?? */
-+ break;
-+ } /* end switch */
-+
-+ return pri_presentation;
-+}
-+#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;
-+ } /* end switch */
-+
-+ return ast_source;
-+}
-+#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;
-+ } /* end switch */
-+
-+ return pri_source;
-+}
-+#endif /* defined(HAVE_PRI) */
-+
- static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout)
- {
- struct dahdi_pvt *p = ast->tech_pvt;
-@@ -3391,7 +3581,8 @@
- ast_mutex_unlock(&p->lock);
- return -1;
- }
--#ifdef HAVE_SS7
-+
-+#if defined(HAVE_SS7)
- if (p->ss7) {
- char ss7_called_nai;
- int called_nai_strip;
-@@ -3528,7 +3719,8 @@
- ast_setstate(ast, AST_STATE_DIALING);
- ss7_rel(p->ss7);
- }
--#endif /* HAVE_SS7 */
-+#endif /* defined(HAVE_SS7) */
-+
- #ifdef HAVE_OPENR2
- if (p->mfcr2) {
- openr2_calling_party_category_t chancat;
-@@ -3563,7 +3755,8 @@
- ast_setstate(ast, AST_STATE_DIALING);
- }
- #endif /* HAVE_OPENR2 */
--#ifdef HAVE_PRI
-+
-+#if defined(HAVE_PRI)
- if (p->pri) {
- struct pri_sr *sr;
- #ifdef SUPPORT_USERUSER
-@@ -3574,8 +3767,6 @@
- int prilocaldialplan;
- int ldp_strip;
- int exclusive;
-- const char *rr_str;
-- int redirect_reason;
-
- c = strchr(dest, '/');
- if (c) {
-@@ -3804,20 +3995,10 @@
- }
- 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));
-- if ((rr_str = pbx_builtin_getvar_helper(ast, "PRIREDIRECTREASON"))) {
-- if (!strcasecmp(rr_str, "UNKNOWN"))
-- redirect_reason = 0;
-- else if (!strcasecmp(rr_str, "BUSY"))
-- redirect_reason = 1;
-- else if (!strcasecmp(rr_str, "NO_REPLY"))
-- redirect_reason = 2;
-- else if (!strcasecmp(rr_str, "UNCONDITIONAL"))
-- redirect_reason = 15;
-- else
-- redirect_reason = PRI_REDIR_UNCONDITIONAL;
-- } else
-- redirect_reason = PRI_REDIR_UNCONDITIONAL;
-- pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, p->pri->localdialplan - 1, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, redirect_reason);
-+ 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);
-
- #ifdef SUPPORT_USERUSER
- /* User-user info */
-@@ -3838,7 +4019,8 @@
- ast_setstate(ast, AST_STATE_DIALING);
- pri_rel(p->pri);
- }
--#endif
-+#endif /* defined(HAVE_PRI) */
-+
- ast_mutex_unlock(&p->lock);
- return 0;
- }
-@@ -7111,6 +7293,7 @@
- int res=-1;
- int idx;
- int func = DAHDI_FLASH;
-+
- ast_mutex_lock(&p->lock);
- idx = dahdi_get_index(chan, p, 0);
- ast_debug(1, "Requested indication %d on channel %s\n", condition, chan->name);
-@@ -7345,6 +7528,65 @@
- case -1:
- res = tone_zone_play_tone(p->subs[idx].dfd, -1);
- break;
-+ 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) {
-+ 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);
-+ pri_connected_line_update(p->pri->pri, p->call, &connected);
-+ }
-+#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);
-+ }
-+#endif /* defined(HAVE_PRI) */
-+ break;
- }
- } else
- res = 0;
-@@ -12607,17 +12849,17 @@
- if (chanpos > -1) {
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- /* queue DTMF frame if the PBX for this call was already started (we're forwarding KEYPAD_DIGITs further on */
-- if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && pri->pvts[chanpos]->call==e->digit.call && pri->pvts[chanpos]->owner) {
-+ if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
-+ && pri->pvts[chanpos]->call == e->digit.call
-+ && pri->pvts[chanpos]->owner) {
- /* how to do that */
- int digitlen = strlen(e->digit.digits);
-- char digit;
- int i;
-+
- for (i = 0; i < digitlen; i++) {
-- digit = e->digit.digits[i];
-- {
-- struct ast_frame f = { AST_FRAME_DTMF, digit, };
-- dahdi_queue_frame(pri->pvts[chanpos], &f, pri);
-- }
-+ struct ast_frame f = { AST_FRAME_DTMF, e->digit.digits[i], };
-+
-+ dahdi_queue_frame(pri->pvts[chanpos], &f, pri);
- }
- }
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-@@ -12635,17 +12877,40 @@
- if (chanpos > -1) {
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- /* queue DTMF frame if the PBX for this call was already started (we're forwarding INFORMATION further on */
-- if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && pri->pvts[chanpos]->call==e->ring.call && pri->pvts[chanpos]->owner) {
-+ if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
-+ && pri->pvts[chanpos]->call == e->ring.call
-+ && pri->pvts[chanpos]->owner) {
- /* how to do that */
- int digitlen = strlen(e->ring.callednum);
-- char digit;
- int i;
-+
- for (i = 0; i < digitlen; i++) {
-- digit = e->ring.callednum[i];
-- {
-- struct ast_frame f = { AST_FRAME_DTMF, digit, };
-- dahdi_queue_frame(pri->pvts[chanpos], &f, pri);
-+ struct ast_frame f = { AST_FRAME_DTMF, e->ring.callednum[i], };
-+
-+ dahdi_queue_frame(pri->pvts[chanpos], &f, pri);
-+ }
-+ if (pri->pvts[chanpos]->owner) {
-+ char dnid[AST_MAX_EXTENSION];
-+
-+ /*
-+ * Append the received info digits to the end of
-+ * the exten and dnid strings
-+ */
-+ strncat(pri->pvts[chanpos]->owner->exten,
-+ e->ring.callednum,
-+ sizeof(pri->pvts[chanpos]->owner->exten) - 1
-+ - strlen(pri->pvts[chanpos]->owner->exten));
-+ if (pri->pvts[chanpos]->owner->cid.cid_dnid) {
-+ ast_copy_string(dnid,
-+ pri->pvts[chanpos]->owner->cid.cid_dnid,
-+ sizeof(dnid));
-+ ast_free(pri->pvts[chanpos]->owner->cid.cid_dnid);
-+ } else {
-+ dnid[0] = 0;
- }
-+ strncat(dnid, e->ring.callednum,
-+ sizeof(dnid) - 1 - strlen(dnid));
-+ pri->pvts[chanpos]->owner->cid.cid_dnid = ast_strdup(dnid);
- }
- }
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-@@ -12683,6 +12948,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);
- if (pri->switchtype == PRI_SWITCH_GR303_TMC) {
- /* Should be safe to lock CRV AFAIK while bearer is still locked */
-@@ -12704,6 +12970,17 @@
- 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) {
-@@ -12789,7 +13066,9 @@
- pri->pvts[chanpos]->callingpres = e->ring.callingpres;
-
- /* Start PBX */
-- if (!e->ring.complete && (pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
-+ if (!e->ring.complete
-+ && (pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
-+ && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
- /* Release the PRI lock while we create the channel */
- ast_mutex_unlock(&pri->lock);
- if (crv) {
-@@ -12804,6 +13083,9 @@
-
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-
-+ if (c && (redirecting.from.number || redirecting.from.name)) {
-+ ast_channel_update_redirecting(c, &redirecting);
-+ }
- if (!ast_strlen_zero(e->ring.callingsubaddr)) {
- pbx_builtin_setvar_helper(c, "CALLINGSUBADDR", e->ring.callingsubaddr);
- }
-@@ -12821,8 +13103,10 @@
-
- snprintf(calledtonstr, sizeof(calledtonstr), "%d", e->ring.calledplan);
- pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr);
-- if (e->ring.redirectingreason >= 0)
-+ if (e->ring.redirectingreason >= 0) {
-+ /* This is now just a status variable. Use REDIRECTING() dialplan function. */
- pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
-+ }
-
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- ast_mutex_lock(&pri->lock);
-@@ -12849,6 +13133,9 @@
-
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-
-+ if (redirecting.from.number || redirecting.from.name) {
-+ ast_channel_update_redirecting(c, &redirecting);
-+ }
- if (e->ring.ani2 >= 0) {
- snprintf(ani2str, 5, "%d", e->ring.ani2);
- pbx_builtin_setvar_helper(c, "ANI2", ani2str);
-@@ -12861,8 +13148,10 @@
- }
- #endif
-
-- if (e->ring.redirectingreason >= 0)
-+ if (e->ring.redirectingreason >= 0) {
-+ /* This is now just a status variable. Use REDIRECTING() dialplan function. */
- pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
-+ }
-
- snprintf(calledtonstr, sizeof(calledtonstr), "%d", e->ring.calledplan);
- pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr);
-@@ -12946,6 +13235,19 @@
- }
- #endif
-
-+ if ((e->ringing.calledname[0] || e->ringing.callednum[0]) && pri->pvts[chanpos]->owner) {
-+ struct ast_party_connected_line connected;
-+
-+ /* 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(pri->pvts[chanpos]->owner, &connected);
-+ }
-+
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
- }
- }
-@@ -13050,12 +13352,85 @@
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- ast_copy_string(pri->pvts[chanpos]->lastcid_num, e->facname.callingnum, sizeof(pri->pvts[chanpos]->lastcid_num));
- ast_copy_string(pri->pvts[chanpos]->lastcid_name, e->facname.callingname, sizeof(pri->pvts[chanpos]->lastcid_name));
-- pri->pvts[chanpos]->subs[SUB_REAL].needcallerid =1;
-+ pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
- dahdi_enable_ec(pri->pvts[chanpos]);
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
- }
- }
- break;
-+ case PRI_EVENT_FACILITY:
-+ 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_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 {
-+ int i;
-+
-+ ast_mutex_lock(&pri->pvts[chanpos]->lock);
-+ for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
-+ struct subcommand *subcmd = &e->facility.subcmds.subcmd[i];
-+ struct ast_channel *owner;
-+
-+ switch (subcmd->cmd) {
-+ case CMD_CONNECTEDLINE:
-+ owner = pri->pvts[chanpos]->owner;
-+ if (owner) {
-+ struct ast_party_connected_line connected;
-+ struct cmd_connectedline *cmdcl;
-+
-+ /* Update the connected line information on the other channel */
-+ ast_party_connected_line_init(&connected);
-+ cmdcl = &subcmd->connectedline;
-+ connected.id.number = cmdcl->connected.id.number;
-+ connected.id.name = cmdcl->connected.id.name;
-+ connected.id.number_type = cmdcl->connected.id.number_type;
-+ connected.id.number_presentation = pri_to_ast_presentation(cmdcl->connected.id.number_presentation);
-+ connected.source = pri_to_ast_connected_line_update_source(cmdcl->connected.source);
-+ ast_channel_queue_connected_line_update(owner, &connected);
-+
-+ ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->connected.id.number, sizeof(pri->pvts[chanpos]->lastcid_num));
-+ ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->connected.id.name, sizeof(pri->pvts[chanpos]->lastcid_name));
-+
-+ pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
-+ //dahdi_enable_ec(pri->pvts[chanpos]);
-+ }
-+ break;
-+ case CMD_REDIRECTING:
-+ owner = pri->pvts[chanpos]->owner;
-+ if (owner) {
-+ struct ast_party_redirecting redirecting = {{0,},};
-+ struct cmd_redirecting *cmdr;
-+
-+ cmdr = &subcmd->redirecting;
-+ redirecting.from.number = cmdr->redirecting.from.number;
-+ redirecting.from.name = cmdr->redirecting.from.name;
-+ redirecting.from.number_type = cmdr->redirecting.from.number_type;
-+ redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->redirecting.from.number_presentation);
-+ redirecting.to.number = cmdr->redirecting.to.number;
-+ redirecting.to.name = cmdr->redirecting.to.name;
-+ redirecting.to.number_type = cmdr->redirecting.to.number_type;
-+ redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->redirecting.to.number_presentation);
-+ redirecting.count = 0;
-+ redirecting.reason = pri_to_ast_reason(cmdr->redirecting.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);
-+ }
-+ }
-+ break;
- case PRI_EVENT_ANSWER:
- chanpos = pri_find_principle(pri, e->answer.channel);
- if (chanpos < 0) {
-@@ -13067,6 +13442,9 @@
- 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);
- /* Now we can do call progress detection */
-
-@@ -13105,15 +13483,26 @@
- dahdi_enable_ec(pri->pvts[chanpos]);
- }
-
-+ owner = pri->pvts[chanpos]->owner;
- #ifdef SUPPORT_USERUSER
- if (!ast_strlen_zero(e->answer.useruserinfo)) {
-- struct ast_channel *owner = pri->pvts[chanpos]->owner;
- 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);
- }
- }
-@@ -13152,6 +13541,7 @@
- break;
- default:
- pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
-+ break;
- }
- }
- }
-Index: CHANGES
-===================================================================
---- a/CHANGES (.../trunk) (revision 186562)
-+++ b/CHANGES (.../team/group/issue14068) (revision 186562)
-@@ -55,6 +55,10 @@
- received number from the ISDN link if that number has the corresponding
- Type-Of-Number.
-
-+libpri channel driver (chan_dahdi) changes
-+-------------------------------------------
-+ * The channel variable PRIREDIRECTREASON is now just a status variable.
-+ Use the REDIRECTING(reason) dialplan function to alter the reason.
-
- SIP channel driver (chan_sip) changes
- -------------------------------------------
-Index: funcs/func_redirecting.c
-===================================================================
---- a/funcs/func_redirecting.c (.../trunk) (revision 0)
-+++ b/funcs/func_redirecting.c (.../team/group/issue14068) (revision 186562)
-@@ -0,0 +1,474 @@
-+/*
-+ * Asterisk -- An open source telephony toolkit.
-+ *
-+ * Copyright (C) 2008 Digium, Inc.
-+ *
-+ * Richard Mudgett <rmudgett@digium.com>
-+ *
-+ * See http://www.asterisk.org for more information about
-+ * the Asterisk project. Please do not directly contact
-+ * any of the maintainers of this project for assistance;
-+ * the project provides a web site, mailing lists and IRC
-+ * channels for your use.
-+ *
-+ * This program is free software, distributed under the terms of
-+ * the GNU General Public License Version 2. See the LICENSE file
-+ * at the top of the source tree.
-+ */
-+
-+/*!
-+ * \file
-+ * \brief Redirecting data dialplan function
-+ * \ingroup functions
-+ *
-+ * \author Richard Mudgett <rmudgett@digium.com>
-+ *
-+ * See Also:
-+ * \arg \ref AstCREDITS
-+ */
-+
-+
-+#include "asterisk.h"
-+
-+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-+
-+/* ------------------------------------------------------------------- */
-+
-+
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <sys/types.h>
-+
-+#include "asterisk/module.h"
-+#include "asterisk/channel.h"
-+#include "asterisk/pbx.h"
-+#include "asterisk/logger.h"
-+#include "asterisk/utils.h"
-+#include "asterisk/app.h"
-+#include "asterisk/options.h"
-+#include "asterisk/callerid.h"
-+
-+/*** DOCUMENTATION
-+ <function name="REDIRECTING" language="en_US">
-+ <synopsis>
-+ Gets or sets Redirecting data on the channel.
-+ </synopsis>
-+ <syntax>
-+ <parameter name="datatype" required="true">
-+ <para>The allowable datatypes are:</para>
-+ <enumlist>
-+ <enum name = "from-all" />
-+ <enum name = "from-num" />
-+ <enum name = "from-name" />
-+ <enum name = "from-ton" />
-+ <enum name = "to-all" />
-+ <enum name = "to-num" />
-+ <enum name = "to-name" />
-+ <enum name = "to-ton" />
-+ <enum name = "pres" />
-+ <enum name = "reason" />
-+ <enum name = "count" />
-+ </enumlist>
-+ </parameter>
-+ <parameter name="i">
-+ <para>If set, this will prevent the channel from sending out protocol
-+ messages because of the value being set</para>
-+ </parameter>
-+ </syntax>
-+ <description>
-+ <para>Gets or sets Redirecting data on the channel. The allowable values
-+ for the <replaceable>reason</replaceable> field are the following:</para>
-+ <enumlist>
-+ <enum name = "unknown"><para>Unknown</para></enum>
-+ <enum name = "cfb"><para>Call Forwarding Busy</para></enum>
-+ <enum name = "cfnr"><para>Call Forwarding No Reply</para></enum>
-+ <enum name = "unavailable"><para>Callee is Unavailable</para></enum>
-+ <enum name = "time_of_day"><para>Time of Day</para></enum>
-+ <enum name = "dnd"><para>Do Not Disturb</para></enum>
-+ <enum name = "deflection"><para>Call Deflection</para></enum>
-+ <enum name = "follow_me"><para>Follow Me</para></enum>
-+ <enum name = "out_of_order"><para>Called DTE Out-Of-Order</para></enum>
-+ <enum name = "away"><para>Callee is Away</para></enum>
-+ <enum name = "cf_dte"><para>Call Forwarding By The Called DTE</para></enum>
-+ <enum name = "cfu"><para>Call Forwarding Unconditional</para></enum>
-+ </enumlist>
-+ </description>
-+ </function>
-+ ***/
-+
-+enum ID_FIELD_STATUS {
-+ ID_FIELD_VALID,
-+ ID_FIELD_INVALID,
-+ ID_FIELD_UNKNOWN
-+};
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Read values from the party id struct.
-+ *
-+ * \param buf Buffer to fill with read value.
-+ * \param len Length of the buffer
-+ * \param data Remaining function datatype string
-+ *
-+ * \retval ID_FIELD_VALID on success.
-+ * \retval ID_FIELD_UNKNOWN on unknown field name.
-+ */
-+static enum ID_FIELD_STATUS redirecting_id_read(char *buf, size_t len, char *data, const struct ast_party_id *id)
-+{
-+ enum ID_FIELD_STATUS status;
-+
-+ status = ID_FIELD_VALID;
-+
-+ if (!strncasecmp("all", data, 3)) {
-+ snprintf(buf, len, "\"%s\" <%s>",
-+ S_OR(id->name, ""),
-+ S_OR(id->number, ""));
-+ } else if (!strncasecmp("name", data, 4)) {
-+ if (id->name) {
-+ ast_copy_string(buf, id->name, len);
-+ }
-+ } else if (!strncasecmp("num", data, 3)) {
-+ if (id->number) {
-+ ast_copy_string(buf, id->number, len);
-+ }
-+ } else if (!strncasecmp("ton", data, 3)) {
-+ snprintf(buf, len, "%d", id->number_type);
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ ast_copy_string(buf, ast_named_caller_presentation(id->number_presentation), len);
-+ } else {
-+ status = ID_FIELD_UNKNOWN;
-+ }
-+
-+ return status;
-+}
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Read values from the redirecting information struct.
-+ *
-+ * \param chan Asterisk channel to read
-+ * \param cmd Not used
-+ * \param data Redirecting function datatype string
-+ * \param buf Buffer to fill with read value.
-+ * \param len Length of the buffer
-+ *
-+ * \retval 0 on success.
-+ * \retval -1 on error.
-+ */
-+static int redirecting_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
-+{
-+ /* Ensure that the buffer is empty */
-+ *buf = 0;
-+
-+ if (!chan)
-+ return -1;
-+
-+ ast_channel_lock(chan);
-+
-+ if (!strncasecmp("from-", data, 5)) {
-+ struct ast_party_id from_id;
-+
-+ from_id = chan->redirecting.from;
-+ from_id.number = chan->cid.cid_rdnis;
-+ switch (redirecting_id_read(buf, len, data + 5, &from_id)) {
-+ case ID_FIELD_VALID:
-+ case ID_FIELD_INVALID:
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ break;
-+ }
-+ } else if (!strncasecmp("to-", data, 3)) {
-+ switch (redirecting_id_read(buf, len, data + 3, &chan->redirecting.to)) {
-+ case ID_FIELD_VALID:
-+ case ID_FIELD_INVALID:
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ break;
-+ }
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ ast_copy_string(buf, ast_named_caller_presentation(chan->redirecting.from.number_presentation), len);
-+ } else if (!strncasecmp("reason", data, 6)) {
-+ ast_copy_string(buf, ast_redirecting_reason_name(chan->redirecting.reason), len);
-+ } else if (!strncasecmp("count", data, 5)) {
-+ snprintf(buf, len, "%d", chan->redirecting.count);
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ }
-+
-+ ast_channel_unlock(chan);
-+
-+ return 0;
-+}
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Write new values to the party id struct
-+ *
-+ * \param id Party ID struct to write values
-+ * \param data Remaining function datatype string
-+ * \param value Value to assign to the party id.
-+ *
-+ * \retval ID_FIELD_VALID on success.
-+ * \retval ID_FIELD_INVALID on error with field value.
-+ * \retval ID_FIELD_UNKNOWN on unknown field name.
-+ */
-+static enum ID_FIELD_STATUS redirecting_id_write(struct ast_party_id *id, char *data, const char *value)
-+{
-+ char *val;
-+ enum ID_FIELD_STATUS status;
-+
-+ status = ID_FIELD_VALID;
-+
-+ if (!strncasecmp("all", data, 3)) {
-+ char name[256];
-+ char num[256];
-+
-+ ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
-+ if (!(id->name = ast_strdup(name))) {
-+ return ID_FIELD_INVALID;
-+ }
-+ if (!(id->number = ast_strdup(num))) {
-+ return ID_FIELD_INVALID;
-+ }
-+ } else if (!strncasecmp("name", data, 4)) {
-+ id->name = ast_strdup(value);
-+ ast_trim_blanks(id->name);
-+ } else if (!strncasecmp("num", data, 3)) {
-+ id->number = ast_strdup(value);
-+ ast_trim_blanks(id->number);
-+ } else if (!strncasecmp("ton", data, 3)) {
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ id->number_type = atoi(val);
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown redirecting type of number '%s', value unchanged\n", val);
-+ status = ID_FIELD_INVALID;
-+ }
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ int pres;
-+
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ pres = atoi(val);
-+ } else {
-+ pres = ast_parse_caller_presentation(val);
-+ }
-+
-+ if (pres < 0) {
-+ ast_log(LOG_ERROR, "Unknown redirecting number presentation '%s', value unchanged\n", val);
-+ status = ID_FIELD_INVALID;
-+ } else {
-+ id->number_presentation = pres;
-+ }
-+ } else {
-+ status = ID_FIELD_UNKNOWN;
-+ }
-+
-+ return status;
-+}
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Write new values to the redirecting information struct.
-+ *
-+ * \param chan Asterisk channel to update
-+ * \param cmd Not used
-+ * \param data Redirecting function datatype string
-+ * \param value Value to assign to the redirecting information struct.
-+ *
-+ * \retval 0 on success.
-+ * \retval -1 on error.
-+ */
-+static int redirecting_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
-+{
-+ struct ast_party_redirecting redirecting;
-+ char *val;
-+ char *option;
-+ void (*set_it)(struct ast_channel *chan, const struct ast_party_redirecting *redirecting);
-+
-+ if (!value || !chan) {
-+ return -1;
-+ }
-+
-+ /* Determine if the update indication inhibit option is present */
-+ option = strchr(data, ',');
-+ if (option) {
-+ option = ast_skip_blanks(option + 1);
-+ switch (*option) {
-+ case 'i':
-+ set_it = ast_channel_set_redirecting;
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown redirecting option '%s'.\n", option);
-+ return 0;
-+ }
-+ }
-+ else {
-+ set_it = ast_channel_update_redirecting;
-+ }
-+
-+ ast_channel_lock(chan);
-+ ast_party_redirecting_set_init(&redirecting, &chan->redirecting);
-+ ast_channel_unlock(chan);
-+
-+ value = ast_skip_blanks(value);
-+
-+ if (!strncasecmp("from-", data, 5)) {
-+ switch (redirecting_id_write(&redirecting.from, data + 5, value)) {
-+ case ID_FIELD_VALID:
-+ set_it(chan, &redirecting);
-+ ast_party_redirecting_free(&redirecting);
-+ break;
-+
-+ case ID_FIELD_INVALID:
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ break;
-+ }
-+ } else if (!strncasecmp("to-", data, 3)) {
-+ switch (redirecting_id_write(&redirecting.to, data + 3, value)) {
-+ case ID_FIELD_VALID:
-+ set_it(chan, &redirecting);
-+ ast_party_redirecting_free(&redirecting);
-+ break;
-+
-+ case ID_FIELD_INVALID:
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ break;
-+ }
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ int pres;
-+
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ pres = atoi(val);
-+ } else {
-+ pres = ast_parse_caller_presentation(val);
-+ }
-+
-+ if (pres < 0) {
-+ ast_log(LOG_ERROR, "Unknown redirecting number presentation '%s', value unchanged\n", val);
-+ } else {
-+ redirecting.from.number_presentation = pres;
-+ redirecting.to.number_presentation = pres;
-+ set_it(chan, &redirecting);
-+ }
-+ } else if (!strncasecmp("reason", data, 6)) {
-+ int reason;
-+
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ reason = atoi(val);
-+ } else {
-+ reason = ast_redirecting_reason_parse(val);
-+ }
-+
-+ if (reason < 0) {
-+ ast_log(LOG_ERROR, "Unknown redirecting reason '%s', value unchanged\n", val);
-+ } else {
-+ redirecting.reason = reason;
-+ set_it(chan, &redirecting);
-+ }
-+ } else if (!strncasecmp("count", data, 5)) {
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ redirecting.count = atoi(val);
-+ set_it(chan, &redirecting);
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown redirecting count '%s', value unchanged\n", val);
-+ }
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
-+ }
-+
-+ return 0;
-+}
-+
-+
-+
-+
-+static struct ast_custom_function redirecting_function = {
-+ .name = "REDIRECTING",
-+ .read = redirecting_read,
-+ .write = redirecting_write,
-+};
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Unload the function module
-+ *
-+ * \retval 0 on success.
-+ * \retval -1 on error.
-+ */
-+static int unload_module(void)
-+{
-+ return ast_custom_function_unregister(&redirecting_function);
-+}
-+
-+
-+
-+
-+/* ******************************************************************* */
-+/*!
-+ * \internal
-+ * \brief Load and initialize the function module.
-+ *
-+ * \retval 0 on success.
-+ * \retval -1 on error.
-+ */
-+static int load_module(void)
-+{
-+ return ast_custom_function_register(&redirecting_function)
-+ ? AST_MODULE_LOAD_DECLINE
-+ : AST_MODULE_LOAD_SUCCESS;
-+}
-+
-+
-+
-+
-+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Redirecting data dialplan function");
-+
-+
-+/* ------------------------------------------------------------------- */
-+/* end func_redirecting.c */
-
-Property changes on: funcs/func_redirecting.c
-___________________________________________________________________
-Added: svn:eol-style
- + native
-Added: svn:mime-type
- + text/plain
-Added: svn:keywords
- + Author Date Id Revision
-
-Index: funcs/func_connectedline.c
-===================================================================
---- a/funcs/func_connectedline.c (.../trunk) (revision 0)
-+++ b/funcs/func_connectedline.c (.../team/group/issue14068) (revision 186562)
-@@ -0,0 +1,239 @@
-+/*
-+ * Asterisk -- An open source telephony toolkit.
-+ *
-+ * Copyright (C) 2007, Gareth Palmer
-+ *
-+ * Gareth Palmer <gareth@acsdata.co.nz>
-+ *
-+ * See http://www.asterisk.org for more information about
-+ * the Asterisk project. Please do not directly contact
-+ * any of the maintainers of this project for assistance;
-+ * the project provides a web site, mailing lists and IRC
-+ * channels for your use.
-+ *
-+ * This program is free software, distributed under the terms of
-+ * the GNU General Public License Version 2. See the LICENSE file
-+ * at the top of the source tree.
-+ */
-+
-+/*! \file
-+ *
-+ * \brief Connected Line dialplan function
-+ *
-+ * \ingroup functions
-+ */
-+
-+#include "asterisk.h"
-+
-+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-+
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <sys/types.h>
-+
-+#include "asterisk/module.h"
-+#include "asterisk/channel.h"
-+#include "asterisk/pbx.h"
-+#include "asterisk/logger.h"
-+#include "asterisk/utils.h"
-+#include "asterisk/app.h"
-+#include "asterisk/options.h"
-+#include "asterisk/callerid.h"
-+
-+/*** DOCUMENTATION
-+ <function name="CONNECTEDLINE" language="en_US">
-+ <synopsis>
-+ Gets or sets Connected Line data on the channel.
-+ </synopsis>
-+ <syntax>
-+ <parameter name="datatype" required="true">
-+ <para>The allowable datatypes are:</para>
-+ <enumlist>
-+ <enum name = "all" />
-+ <enum name = "num" />
-+ <enum name = "name" />
-+ <enum name = "ton" />
-+ <enum name = "pres" />
-+ <enum name = "source" />
-+ </enumlist>
-+ </parameter>
-+ <parameter name="i">
-+ <para>If set, this will prevent the channel from sending out protocol
-+ messages because of the value being set</para>
-+ </parameter>
-+ </syntax>
-+ <description>
-+ <para>Gets or sets Connected Line data on the channel. Possible values
-+ for the <replaceable>source</replaceable> datatype are:</para>
-+ <enumlist>
-+ <enum name="answer"><para>Normal Call Answering</para></enum>
-+ <enum name="transfer_alerting"><para>Call Transfer(Alerting)</para></enum>
-+ <enum name="transfer_active"><para>Call Transfer(Active)</para></enum>
-+ </enumlist>
-+ </description>
-+ </function>
-+ ***/
-+
-+static int connectedline_read(struct ast_channel *chan, const char *cmd, char *data,
-+ char *buf, size_t len)
-+{
-+ /* Ensure that the buffer is empty */
-+ *buf = 0;
-+
-+ if (!chan)
-+ return -1;
-+
-+ ast_channel_lock(chan);
-+
-+ if (!strncasecmp("all", data, 3)) {
-+ snprintf(buf, len, "\"%s\" <%s>",
-+ S_OR(chan->connected.id.name, ""),
-+ S_OR(chan->connected.id.number, ""));
-+ } else if (!strncasecmp("name", data, 4)) {
-+ if (chan->connected.id.name) {
-+ ast_copy_string(buf, chan->connected.id.name, len);
-+ }
-+ } else if (!strncasecmp("num", data, 3)) {
-+ if (chan->connected.id.number) {
-+ ast_copy_string(buf, chan->connected.id.number, len);
-+ }
-+ } else if (!strncasecmp("ton", data, 3)) {
-+ snprintf(buf, len, "%d", chan->connected.id.number_type);
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ ast_copy_string(buf, ast_named_caller_presentation(chan->connected.id.number_presentation), len);
-+ } else if (!strncasecmp("source", data, 6)) {
-+ ast_copy_string(buf, ast_connected_line_source_name(chan->connected.source), len);
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
-+ }
-+
-+ ast_channel_unlock(chan);
-+
-+ return 0;
-+}
-+
-+static int connectedline_write(struct ast_channel *chan, const char *cmd, char *data,
-+ const char *value)
-+{
-+ struct ast_party_connected_line connected;
-+ char *val;
-+ char *option;
-+ void (*set_it)(struct ast_channel *chan, const struct ast_party_connected_line *connected);
-+
-+ if (!value || !chan) {
-+ return -1;
-+ }
-+
-+ /* Determine if the update indication inhibit option is present */
-+ option = strchr(data, ',');
-+ if (option) {
-+ option = ast_skip_blanks(option + 1);
-+ switch (*option) {
-+ case 'i':
-+ set_it = ast_channel_set_connected_line;
-+ break;
-+
-+ default:
-+ ast_log(LOG_ERROR, "Unknown connectedline option '%s'.\n", option);
-+ return 0;
-+ }
-+ }
-+ else {
-+ set_it = ast_channel_update_connected_line;
-+ }
-+
-+ ast_channel_lock(chan);
-+ ast_party_connected_line_set_init(&connected, &chan->connected);
-+ ast_channel_unlock(chan);
-+
-+ value = ast_skip_blanks(value);
-+
-+ if (!strncasecmp("all", data, 3)) {
-+ char name[256];
-+ char num[256];
-+
-+ ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
-+ connected.id.name = name;
-+ connected.id.number = num;
-+ set_it(chan, &connected);
-+ } else if (!strncasecmp("name", data, 4)) {
-+ connected.id.name = ast_strdupa(value);
-+ ast_trim_blanks(connected.id.name);
-+ set_it(chan, &connected);
-+ } else if (!strncasecmp("num", data, 3)) {
-+ connected.id.number = ast_strdupa(value);
-+ ast_trim_blanks(connected.id.number);
-+ set_it(chan, &connected);
-+ } else if (!strncasecmp("ton", data, 3)) {
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ connected.id.number_type = atoi(val);
-+ set_it(chan, &connected);
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown connectedline type of number '%s', value unchanged\n", val);
-+ }
-+ } else if (!strncasecmp("pres", data, 4)) {
-+ int pres;
-+
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ pres = atoi(val);
-+ } else {
-+ pres = ast_parse_caller_presentation(val);
-+ }
-+
-+ if (pres < 0) {
-+ ast_log(LOG_ERROR, "Unknown connectedline number presentation '%s', value unchanged\n", val);
-+ } else {
-+ connected.id.number_presentation = pres;
-+ set_it(chan, &connected);
-+ }
-+ } else if (!strncasecmp("source", data, 6)) {
-+ int source;
-+
-+ val = ast_strdupa(value);
-+ ast_trim_blanks(val);
-+
-+ if (('0' <= val[0]) && (val[0] <= '9')) {
-+ source = atoi(val);
-+ } else {
-+ source = ast_connected_line_source_parse(val);
-+ }
-+
-+ if (source < 0) {
-+ ast_log(LOG_ERROR, "Unknown connectedline source '%s', value unchanged\n", val);
-+ } else {
-+ connected.source = source;
-+ set_it(chan, &connected);
-+ }
-+ } else {
-+ ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
-+ }
-+
-+ return 0;
-+}
-+
-+static struct ast_custom_function connectedline_function = {
-+ .name = "CONNECTEDLINE",
-+ .read = connectedline_read,
-+ .write = connectedline_write,
-+};
-+
-+static int unload_module(void)
-+{
-+ return ast_custom_function_unregister(&connectedline_function);
-+}
-+
-+static int load_module(void)
-+{
-+ return ast_custom_function_register(&connectedline_function)
-+ ? AST_MODULE_LOAD_DECLINE
-+ : AST_MODULE_LOAD_SUCCESS;
-+}
-+
-+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Connected Line dialplan function");
-
-Property changes on: funcs/func_connectedline.c
-___________________________________________________________________
-Added: svn:eol-style
- + native
-Added: svn:mime-type
- + text/plain
-Added: svn:keywords
- + Author Date Id Revision
-
-
-Property changes on: .
-___________________________________________________________________
-Added: automerge
- + *
-Added: svnmerge-integrated
- + /trunk:1-186557
-Added: automerge-email
- + rmudgett@digium.com
-