summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2006-05-17 16:51:47 +0000
committerJoshua Colp <jcolp@digium.com>2006-05-17 16:51:47 +0000
commit15358932ecb8f43f730aa6a7013ff733fdc88f9a (patch)
tree355bf4be2c568d035eb0940a155fac89a6493cf7
parent3fb070853b20e625c66160f6e346ac1918a22a2c (diff)
Add distinctive ring detection with Caller ID for Australia, New Zealand, and other countries. (issue #3596 reported by deon patch by dbowerman with minor mods by moi)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@27812 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_zap.c68
-rw-r--r--configs/zapata.conf.sample3
2 files changed, 65 insertions, 6 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index f3003bbd5..ff87f1fb3 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -206,6 +206,7 @@ static char musicclass[MAX_MUSICCLASS] = "";
static char progzone[10]= "";
static int usedistinctiveringdetection = 0;
+static int distinctiveringaftercid = 0;
static int transfertobusy = 1;
@@ -6246,6 +6247,59 @@ lax);
break;
}
}
+ if (res == 1) {
+ callerid_get(cs, &name, &number, &flags);
+ if (option_debug)
+ ast_log(LOG_DEBUG, "CallerID number: %s, name: %s, flags=%d\n", number, name, flags);
+ }
+ if (distinctiveringaftercid == 1) {
+ /* Clear the current ring data array so we dont have old data in it. */
+ for (receivedRingT=0; receivedRingT < 3; receivedRingT++) {
+ curRingData[receivedRingT] = 0;
+ }
+ receivedRingT = 0;
+ if(option_verbose > 2)
+ ast_verbose( VERBOSE_PREFIX_3 "Detecting post-CID distinctive ring\n");
+ for(;;) {
+ i = ZT_IOMUX_READ | ZT_IOMUX_SIGEVENT;
+ if ((res = ioctl(p->subs[index].zfd, ZT_IOMUX, &i))) {
+ ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno));
+ callerid_free(cs);
+ ast_hangup(chan);
+ return NULL;
+ }
+ if (i & ZT_IOMUX_SIGEVENT) {
+ res = zt_get_event(p->subs[index].zfd);
+ ast_log(LOG_NOTICE, "Got event %d (%s)...\n", res, event2str(res));
+ res = 0;
+ /* Let us detect callerid when the telco uses distinctive ring */
+
+ curRingData[receivedRingT] = p->ringt;
+
+ if (p->ringt < p->ringt_base/2)
+ break;
+ ++receivedRingT; /* Increment the ringT counter so we can match it against
+ values in zapata.conf for distinctive ring */
+ } else if (i & ZT_IOMUX_READ) {
+ res = read(p->subs[index].zfd, buf, sizeof(buf));
+ if (res < 0) {
+ if (errno != ELAST) {
+ ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno));
+ callerid_free(cs);
+ ast_hangup(chan);
+ return NULL;
+ }
+ break;
+ }
+ if (p->ringt)
+ p->ringt--;
+ if (p->ringt == 1) {
+ res = -1;
+ break;
+ }
+ }
+ }
+ }
if (p->usedistinctiveringdetection == 1) {
if(option_verbose > 2)
/* this only shows up if you have n of the dring patterns filled in */
@@ -6254,6 +6308,12 @@ lax);
for (counter=0; counter < 3; counter++) {
/* Check to see if the rings we received match any of the ones in zapata.conf for this
channel */
+ if(option_verbose > 2)
+ /* this only shows up if you have n of the dring patterns filled in */
+ ast_verbose( VERBOSE_PREFIX_3 "Checking %d,%d,%d\n",
+ p->drings.ringnum[counter].ring[0],
+ p->drings.ringnum[counter].ring[1],
+ p->drings.ringnum[counter].ring[2]);
distMatches = 0;
for (counter1=0; counter1 < 3; counter1++) {
if (curRingData[counter1] <= (p->drings.ringnum[counter].ring[counter1]+10) && curRingData[counter1] >=
@@ -6271,11 +6331,6 @@ lax);
}
}
}
- if (res == 1) {
- callerid_get(cs, &name, &number, &flags);
- if (option_debug)
- ast_log(LOG_DEBUG, "CallerID number: %s, name: %s, flags=%d\n", number, name, flags);
- }
/* Restore linear mode (if appropriate) for Caller*ID processing */
zt_setlinear(p->subs[index].zfd, p->subs[index].linear);
#if 1
@@ -10354,6 +10409,9 @@ static int setup_zap(int reload)
} else if (!strcasecmp(v->name, "usedistinctiveringdetection")) {
if (ast_true(v->value))
usedistinctiveringdetection = 1;
+ } else if (!strcasecmp(v->name, "distinctiveringaftercid")) {
+ if (ast_true(v->value))
+ distinctiveringaftercid = 1;
} else if (!strcasecmp(v->name, "dring1context")) {
ast_copy_string(drings.ringContext[0].contextData,v->value,sizeof(drings.ringContext[0].contextData));
} else if (!strcasecmp(v->name, "dring2context")) {
diff --git a/configs/zapata.conf.sample b/configs/zapata.conf.sample
index 95bfb9a6e..ee6db17b8 100644
--- a/configs/zapata.conf.sample
+++ b/configs/zapata.conf.sample
@@ -223,7 +223,8 @@ rxwink=300 ; Atlas seems to use long (250ms) winks
; Whether or not to do distinctive ring detection on FXO lines
;
;usedistinctiveringdetection=yes
-
+;distinctiveringaftercid=yes ; enable dring detection after callerid for those countries like Australia
+ ; where the ring cadence is changed *after* the callerid spill.
;
; Whether or not to use caller ID
;