[asterisk-commits] russell: branch russell/fxo_mwi r90795 - in /team/russell/fxo_mwi: channels/ ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Dec 3 18:15:48 CST 2007
Author: russell
Date: Mon Dec 3 18:15:48 2007
New Revision: 90795
URL: http://svn.digium.com/view/asterisk?view=rev&rev=90795
Log:
Add 1.4 based patch for adding MWI monitoring support for FXO lines. Some of
this will have to be re-worked to work with how MWI works in trunk.
(original patch from markster)
Modified:
team/russell/fxo_mwi/channels/chan_zap.c
team/russell/fxo_mwi/configs/zapata.conf.sample
team/russell/fxo_mwi/include/asterisk/callerid.h
team/russell/fxo_mwi/main/callerid.c
Modified: team/russell/fxo_mwi/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/russell/fxo_mwi/channels/chan_zap.c?view=diff&rev=90795&r1=90794&r2=90795
==============================================================================
--- team/russell/fxo_mwi/channels/chan_zap.c (original)
+++ team/russell/fxo_mwi/channels/chan_zap.c Mon Dec 3 18:15:48 2007
@@ -224,6 +224,7 @@
static char defaultcic[64] = "";
static char defaultozz[64] = "";
+static char externnotify[160] = "";
static char progzone[10] = "";
@@ -552,6 +553,7 @@
unsigned int usedistinctiveringdetection:1;
unsigned int zaptrcallerid:1; /*!< should we use the callerid from incoming call on zap transfer or not */
unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
+ unsigned int mwimonitor:1;
/* Channel state or unavilability flags */
unsigned int inservice:1;
unsigned int locallyblocked:1;
@@ -608,6 +610,7 @@
int callwaitingrepeat; /*!< How many samples to wait before repeating call waiting */
int cidcwexpire; /*!< When to expire our muting for CID/CW */
unsigned char *cidspill;
+ struct callerid_state *mwi;
int cidpos;
int cidlen;
int ringt;
@@ -737,6 +740,7 @@
.mohinterpret = "default",
.mohsuggest = "",
.transfertobusy = 1,
+ .mwimonitor = 0,
.cid_signalling = CID_SIG_BELL,
.cid_start = CID_START_RING,
@@ -1842,6 +1846,15 @@
}
ast_debug(1, "Disabled conferencing\n");
return 0;
+}
+
+static void notify_message(char *mailbox, int thereornot)
+{
+ char s[256];
+ if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(externnotify)) {
+ snprintf(s, sizeof(s), "%s %s %d", externnotify, mailbox, thereornot);
+ ast_safe_system(s);
+ }
}
static int restore_conference(struct zt_pvt *p)
@@ -7325,7 +7338,14 @@
pfds[count].events = POLLPRI;
pfds[count].revents = 0;
/* Message waiting or r2 channels also get watched for reading */
- if (i->cidspill)
+ if (i->mwimonitor && (i->sig & __ZT_SIG_FXS) && !i->mwi) {
+ if (!i->mwi) {
+ i->mwi = callerid_new(i->cid_signalling);
+ bump_gains(i);
+ zt_setlinear(i->subs[SUB_REAL].zfd, 0);
+ }
+ }
+ if (i->cidspill || i->mwi)
pfds[count].events |= POLLIN;
count++;
}
@@ -7414,29 +7434,57 @@
i = i->next;
continue;
}
- if (!i->cidspill) {
+ if (!i->cidspill && !i->mwi) {
ast_log(LOG_WARNING, "Whoa.... I'm reading but have no cidspill (%d)...\n", i->subs[SUB_REAL].zfd);
i = i->next;
continue;
}
res = read(i->subs[SUB_REAL].zfd, buf, sizeof(buf));
if (res > 0) {
- /* We read some number of bytes. Write an equal amount of data */
- if (res > i->cidlen - i->cidpos)
- res = i->cidlen - i->cidpos;
- res2 = write(i->subs[SUB_REAL].zfd, i->cidspill + i->cidpos, res);
- if (res2 > 0) {
- i->cidpos += res2;
- if (i->cidpos >= i->cidlen) {
- ast_free(i->cidspill);
- i->cidspill = 0;
- i->cidpos = 0;
- i->cidlen = 0;
- }
- } else {
- ast_log(LOG_WARNING, "Write failed: %s\n", strerror(errno));
- i->msgstate = -1;
- }
+ if (i->mwi) {
+ if (i->cid_signalling == CID_SIG_V23_JP) {
+ res = callerid_feed_jp(i->mwi, (unsigned char *)buf, res, AST_LAW(i));
+ } else {
+ res = callerid_feed(i->mwi, (unsigned char *)buf, res, AST_LAW(i));
+ }
+ if (res < 0) {
+ ast_log(LOG_WARNING, "MWI CallerID feed failed: %s!\n", strerror(errno));
+ callerid_free(i->mwi);
+ i->mwi = NULL;
+ } else if (res) {
+ char *name, *number;
+ int flags;
+ callerid_get(i->mwi, &number, &name, &flags);
+ if (flags & CID_MSGWAITING) {
+ ast_log(LOG_NOTICE, "MWI: Channel %d message waiting!\n",i->channel);
+ notify_message(i->mailbox, 1);
+ } else if (flags & CID_NOMSGWAITING) {
+ ast_log(LOG_NOTICE, "MWI: Channel %d no message waiting!\n",i->channel);
+ notify_message(i->mailbox, 0);
+ } else
+ ast_log(LOG_NOTICE, "MWI: Channel %d status unknown\n", i->channel);
+ callerid_free(i->mwi);
+ i->mwi = NULL;
+ }
+ } else if (i->cidspill) {
+ /* We read some number of bytes. Write an equal amount of data */
+ if (res > i->cidlen - i->cidpos)
+ res = i->cidlen - i->cidpos;
+ res2 = write(i->subs[SUB_REAL].zfd, i->cidspill + i->cidpos, res);
+ if (res2 > 0) {
+ i->cidpos += res2;
+ if (i->cidpos >= i->cidlen) {
+ free(i->cidspill);
+ i->cidspill = 0;
+ i->cidpos = 0;
+ i->cidlen = 0;
+ }
+ } else {
+ ast_log(LOG_WARNING, "Write failed: %s\n", strerror(errno));
+ i->msgstate = -1;
+ }
+ }
+
} else {
ast_log(LOG_WARNING, "Read failed with %d: %s\n", res, strerror(errno));
}
@@ -7454,6 +7502,12 @@
ast_log(LOG_WARNING, "Whoa.... I'm owned but found (%d)...\n", i->subs[SUB_REAL].zfd);
i = i->next;
continue;
+ }
+ if (i->mwi) {
+ callerid_free(i->mwi);
+ i->mwi = NULL;
+ zt_setlinear(i->subs[SUB_REAL].zfd, i->subs[SUB_REAL].linear);
+ restore_gains(i);
}
res = zt_get_event(i->subs[SUB_REAL].zfd);
ast_debug(1, "Monitor doohicky got event %s on channel %d\n", event2str(res), i->channel);
@@ -7970,6 +8024,7 @@
#endif
tmp->immediate = conf.chan.immediate;
tmp->transfertobusy = conf.chan.transfertobusy;
+ tmp->mwimonitor = conf.chan.mwimonitor;
tmp->sig = conf.chan.sig;
tmp->outsigmod = conf.chan.outsigmod;
tmp->radio = conf.chan.radio;
@@ -11338,6 +11393,7 @@
ast_cli(a->fd, "Caller ID: %s\n", tmp->cid_num);
ast_cli(a->fd, "Calling TON: %d\n", tmp->cid_ton);
ast_cli(a->fd, "Caller ID name: %s\n", tmp->cid_name);
+ ast_cli(a->fd, "Mailbox: %s\n", S_OR(tmp->mailbox, "none"));
if (tmp->vars) {
struct ast_variable *v;
ast_cli(a->fd, "Variables:\n");
@@ -12505,6 +12561,8 @@
confp->chan.immediate = ast_true(v->value);
} else if (!strcasecmp(v->name, "transfertobusy")) {
confp->chan.transfertobusy = ast_true(v->value);
+ } else if (!strcasecmp(v->name, "mwimonitor")) {
+ confp->chan.mwimonitor = ast_true(v->value);
} else if (!strcasecmp(v->name, "cid_rxgain")) {
if (sscanf(v->value, "%f", &confp->chan.cid_rxgain) != 1) {
ast_log(LOG_WARNING, "Invalid cid_rxgain: %s\n", v->value);
@@ -13067,7 +13125,9 @@
ast_copy_string(defaultcic, v->value, sizeof(defaultcic));
} else if (!strcasecmp(v->name, "defaultozz")) {
ast_copy_string(defaultozz, v->value, sizeof(defaultozz));
- }
+ } else if (!strcasecmp(v->name, "externnotify")) {
+ ast_copy_string(externnotify, v->value, sizeof(externnotify));
+ }
} else if (!skipchannels)
ast_log(LOG_WARNING, "Ignoring %s\n", v->name);
}
Modified: team/russell/fxo_mwi/configs/zapata.conf.sample
URL: http://svn.digium.com/view/asterisk/team/russell/fxo_mwi/configs/zapata.conf.sample?view=diff&rev=90795&r1=90794&r2=90795
==============================================================================
--- team/russell/fxo_mwi/configs/zapata.conf.sample (original)
+++ team/russell/fxo_mwi/configs/zapata.conf.sample Mon Dec 3 18:15:48 2007
@@ -337,6 +337,20 @@
;
;hidecallerid=yes
;
+; The following option enables receiving MWI on FXO lines. The default
+; value is no. When this is enabled, and MWI notification indicates on or off,
+; the script specified by the externnotify option is executed.
+;
+;mwimonitor=no
+;
+; This option is used in conjunction with mwimonitor. This will get executed
+; when incoming MWI state changes. The script is passed 2 arguments. The
+; first is the corresponding mailbox, and the second is 1 or 0, indicating if
+; there are messages waiting or not. An example script is provided
+; in contrib/scripts/zapnotify.sh.
+;
+;externnotify=/usr/local/bin/zapnotify.sh
+;
; Whether or not to enable call waiting on internal extensions
; With this set to 'yes', busy extensions will hear the call-waiting
; tone, and can use hook-flash to switch between callers. The Dial()
Modified: team/russell/fxo_mwi/include/asterisk/callerid.h
URL: http://svn.digium.com/view/asterisk/team/russell/fxo_mwi/include/asterisk/callerid.h?view=diff&rev=90795&r1=90794&r2=90795
==============================================================================
--- team/russell/fxo_mwi/include/asterisk/callerid.h (original)
+++ team/russell/fxo_mwi/include/asterisk/callerid.h Mon Dec 3 18:15:48 2007
@@ -49,6 +49,8 @@
#define CID_PRIVATE_NUMBER (1 << 1)
#define CID_UNKNOWN_NAME (1 << 2)
#define CID_UNKNOWN_NUMBER (1 << 3)
+#define CID_MSGWAITING (1 << 4)
+#define CID_NOMSGWAITING (1 << 5)
#define CID_SIG_BELL 1
#define CID_SIG_V23 2
Modified: team/russell/fxo_mwi/main/callerid.c
URL: http://svn.digium.com/view/asterisk/team/russell/fxo_mwi/main/callerid.c?view=diff&rev=90795&r1=90794&r2=90795
==============================================================================
--- team/russell/fxo_mwi/main/callerid.c (original)
+++ team/russell/fxo_mwi/main/callerid.c Mon Dec 3 18:15:48 2007
@@ -555,7 +555,7 @@
cid->sawflag = 2;
break;
case 2: /* Get lead-in */
- if ((b == 0x04) || (b == 0x80)) {
+ if ((b == 0x04) || (b == 0x80) || (b == 0x06) || (b == 0x82)) {
cid->type = b;
cid->sawflag = 3;
cid->cksum = b;
@@ -591,8 +591,10 @@
cid->number[0] = '\0';
cid->name[0] = '\0';
+ /* Update flags */
+ cid->flags = 0;
/* If we get this far we're fine. */
- if (cid->type == 0x80) {
+ if ((cid->type == 0x80) || (cid->type == 0x82)) {
/* MDMF */
/* Go through each element and process */
for (x = 0; x < cid->pos;) {
@@ -626,6 +628,13 @@
memcpy(cid->name, cid->rawdata + x + 1, res);
cid->name[res] = '\0';
break;
+ case 11: /* Message Waiting */
+ res = cid->rawdata[x + 1];
+ if (res)
+ cid->flags |= CID_MSGWAITING;
+ else
+ cid->flags |= CID_NOMSGWAITING;
+ break;
case 17: /* UK: Call type, 1=Voice Call, 2=Ringback when free, 129=Message waiting */
case 19: /* UK: Network message system status (Number of messages waiting) */
case 22: /* Something French */
@@ -643,12 +652,17 @@
x += cid->rawdata[x];
x++;
}
+ } else if (cid->type == 0x6) {
+ /* VMWI SDMF */
+ if (cid->rawdata[2] == 0x42) {
+ cid->flags |= CID_MSGWAITING;
+ } else if (cid->rawdata[2] == 0x6f) {
+ cid->flags |= CID_NOMSGWAITING;
+ }
} else {
/* SDMF */
ast_copy_string(cid->number, cid->rawdata + 8, sizeof(cid->number));
}
- /* Update flags */
- cid->flags = 0;
if (!strcmp(cid->number, "P")) {
strcpy(cid->number, "");
cid->flags |= CID_PRIVATE_NUMBER;
More information about the asterisk-commits
mailing list