aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_zap.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-03-03 17:00:57 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-03-03 17:00:57 +0000
commitd0358c60cda7d1019619a32dfe351457e16ce4e6 (patch)
tree90117d9b7e8daeac720f43fdf23f9532aa2a15d4 /channels/chan_zap.c
parent55d98810bf2dc38e3461098d2e98c98d9abb8ddb (diff)
Add dynamic dialplan support (bug #3566)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5129 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_zap.c')
-rwxr-xr-xchannels/chan_zap.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index a23562647..f27c2660d 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -997,6 +997,14 @@ static char *event2str(int event)
return buf;
}
+static char *dialplan2str(int dialplan)
+{
+ if (dialplan == -1) {
+ return("Dynamically set dialplan in ISDN");
+ }
+ return(pri_plan2str(dialplan));
+}
+
#ifdef ZAPATA_R2
static int str2r2prot(char *swtype)
{
@@ -1764,6 +1772,10 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
#ifdef ZAPATA_PRI
if (p->pri) {
struct pri_sr *sr;
+ int pridialplan;
+ int dp_strip;
+ int prilocaldialplan;
+ int ldp_strip;
c = strchr(dest, '/');
if (c)
c++;
@@ -1824,13 +1836,41 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : PRI_TRANS_CAP_SPEECH,
(p->digital ? -1 :
((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW)));
- pri_sr_set_called(sr, c + p->stripmsd, p->pri->dialplan - 1, s ? 1 : 0);
- pri_sr_set_caller(sr, l, n, p->pri->localdialplan - 1,
+ dp_strip = 0;
+ pridialplan = p->pri->dialplan - 1;
+ if (pridialplan == -2) { /* compute dynamically */
+ if (strncmp(c + p->stripmsd, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) {
+ dp_strip = strlen(p->pri->internationalprefix);
+ pridialplan = PRI_INTERNATIONAL_ISDN;
+ } else if (strncmp(c + p->stripmsd, p->pri->nationalprefix, strlen(p->pri->nationalprefix)) == 0) {
+ dp_strip = strlen(p->pri->nationalprefix);
+ pridialplan = PRI_NATIONAL_ISDN;
+ } else {
+ pridialplan = PRI_LOCAL_ISDN;
+ }
+ }
+ pri_sr_set_called(sr, c + p->stripmsd + dp_strip, pridialplan, s ? 1 : 0);
+
+ ldp_strip = 0;
+ prilocaldialplan = p->pri->localdialplan - 1;
+ if ((l != NULL) && (prilocaldialplan == -2)) { /* compute dynamically */
+ if (strncmp(l, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) {
+ ldp_strip = strlen(p->pri->internationalprefix);
+ prilocaldialplan = PRI_INTERNATIONAL_ISDN;
+ } else if (strncmp(l, p->pri->nationalprefix, strlen(p->pri->nationalprefix)) == 0) {
+ ldp_strip = strlen(p->pri->nationalprefix);
+ prilocaldialplan = PRI_NATIONAL_ISDN;
+ } else {
+ prilocaldialplan = PRI_LOCAL_ISDN;
+ }
+ }
+ pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan,
l ? (p->use_callingpres ? ast->cid.cid_pres : PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN) :
PRES_NUMBER_NOT_AVAILABLE);
pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, p->pri->localdialplan - 1, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, PRI_REDIR_UNCONDITIONAL);
if (pri_setup(p->pri->pri, p->call, sr)) {
- ast_log(LOG_WARNING, "Unable to setup call to %s\n", c + p->stripmsd);
+ ast_log(LOG_WARNING, "Unable to setup call to %s (using %s)\n",
+ c + p->stripmsd + dp_strip, dialplan2str(p->pri->dialplan));
pri_rel(p->pri);
ast_mutex_unlock(&p->lock);
pri_sr_free(sr);
@@ -6494,7 +6534,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
return NULL;
}
if ((pris[span].dialplan) && (pris[span].dialplan != dialplan)) {
- ast_log(LOG_ERROR, "Span %d is already a %s dialing plan\n", span + 1, pri_plan2str(pris[span].dialplan));
+ ast_log(LOG_ERROR, "Span %d is already a %s dialing plan\n", span + 1, dialplan2str(pris[span].dialplan));
destroy_zt_pvt(&tmp);
return NULL;
}
@@ -9815,6 +9855,8 @@ static int setup_zap(int reload)
dialplan = PRI_INTERNATIONAL_ISDN + 1;
} else if (!strcasecmp(v->value, "local")) {
dialplan = PRI_LOCAL_ISDN + 1;
+ } else if (!strcasecmp(v->value, "dynamic")) {
+ dialplan = -1;
} else {
ast_log(LOG_WARNING, "Unknown PRI dialplan '%s' at line %d.\n", v->value, v->lineno);
}
@@ -9829,6 +9871,8 @@ static int setup_zap(int reload)
localdialplan = PRI_INTERNATIONAL_ISDN + 1;
} else if (!strcasecmp(v->value, "local")) {
localdialplan = PRI_LOCAL_ISDN + 1;
+ } else if (!strcasecmp(v->value, "dynamic")) {
+ localdialplan = -1;
} else {
ast_log(LOG_WARNING, "Unknown PRI dialplan '%s' at line %d.\n", v->value, v->lineno);
}