summaryrefslogtreecommitdiff
path: root/funcs/func_callerid.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2009-10-22 16:33:22 +0000
committerRichard Mudgett <rmudgett@digium.com>2009-10-22 16:33:22 +0000
commit1174a6161274ee600f77089bff5f87a98f57bf4f (patch)
tree6e14b9b86b44349743912e3e737f8cbe8c706d22 /funcs/func_callerid.c
parent3acfd4933cf70974fda938fb2e7421d659aa87d0 (diff)
Add support for calling and called subaddress. Partial support for COLP subaddress.
The Telecom Specs in NZ suggests that SUB ADDRESS is always on, so doing "desk to desk" between offices each with an asterisk box over the ISDN should then be possible, without a whole load of DDI numbers required. (closes issue #15604) Reported by: alecdavis Patches: asterisk_subaddr_trunk.diff11.txt uploaded by alecdavis (license 585) Some minor modificatons were made. Tested by: alecdavis, rmudgett Review: https://reviewboard.asterisk.org/r/405/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@225357 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'funcs/func_callerid.c')
-rw-r--r--funcs/func_callerid.c84
1 files changed, 79 insertions, 5 deletions
diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c
index fa81c8407..3e9e74e0a 100644
--- a/funcs/func_callerid.c
+++ b/funcs/func_callerid.c
@@ -49,6 +49,12 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name="RDNIS" />
<enum name="pres" />
<enum name="ton" />
+ <enum name="subaddr[-valid]|[-type]|[-odd]">
+ <para>ISDN Calling Subaddress</para>
+ </enum>
+ <enum name="dnid-subaddr[-valid]|[-type]|[-odd]">
+ <para>ISDN Called Subaddress</para>
+ </enum>
</enumlist>
</parameter>
<parameter name="CID">
@@ -167,8 +173,40 @@ static int callerid_read(struct ast_channel *chan, const char *cmd, char *data,
ast_copy_string(buf, chan->cid.cid_ani, len);
}
} else if (!strncasecmp("dnid", data, 4)) {
- if (chan->cid.cid_dnid) {
- ast_copy_string(buf, chan->cid.cid_dnid, len);
+ /* Called parties info */
+
+ /* also matches dnid-subaddr-valid, dnid-subaddr-type, dnid-subaddr-odd, dnid-subaddr */
+ if (!strncasecmp(data + 4 ,"-subaddr", 8)) {
+ if (!strncasecmp(data + 12 ,"-valid", 6)) { /* dnid-subaddr-valid */
+ snprintf(buf, len, "%d", chan->cid.dialed_subaddress.valid);
+ } else if (!strncasecmp(data + 12 ,"-type", 5)) { /* dnid-subaddr-type */
+ snprintf(buf, len, "%d", chan->cid.dialed_subaddress.type);
+ } else if (!strncasecmp(data + 12 ,"-odd", 4)) { /* dnid-subaddr-odd */
+ snprintf(buf, len, "%d", chan->cid.dialed_subaddress.odd_even_indicator);
+ } else { /* dnid-subaddr */
+ if (chan->cid.dialed_subaddress.str) {
+ ast_copy_string(buf, chan->cid.dialed_subaddress.str, len);
+ }
+ }
+ } else { /* dnid */
+ if (chan->cid.cid_dnid) {
+ ast_copy_string(buf, chan->cid.cid_dnid, len);
+ }
+ }
+ } else if (!strncasecmp("subaddr", data, 7)) {
+ /* Calling parties info */
+
+ /* also matches subaddr-valid, subaddr-type, subaddr-odd, subaddr */
+ if (!strncasecmp(data + 7 ,"-valid", 6)) { /* subaddr-valid */
+ snprintf(buf, len, "%d", chan->cid.subaddress.valid);
+ } else if (!strncasecmp(data + 7 ,"-type", 5)) { /* subaddr-type */
+ snprintf(buf, len, "%d", chan->cid.subaddress.type);
+ } else if (!strncasecmp(data + 7 ,"-odd", 4)) { /* subaddr-odd */
+ snprintf(buf, len, "%d", chan->cid.subaddress.odd_even_indicator);
+ } else { /* subaddr */
+ if (chan->cid.subaddress.str) {
+ ast_copy_string(buf, chan->cid.subaddress.str, len);
+ }
}
} else if (!strncasecmp("rdnis", data, 5)) {
if (chan->cid.cid_rdnis) {
@@ -227,10 +265,46 @@ static int callerid_write(struct ast_channel *chan, const char *cmd, char *data,
}
} else if (!strncasecmp("dnid", data, 4)) {
ast_channel_lock(chan);
- if (chan->cid.cid_dnid) {
- ast_free(chan->cid.cid_dnid);
+ /* also matches dnid-subaddr-valid, dnid-subaddr-type, dnid-subaddr-odd, dnid-subaddr */
+ if (!strncasecmp(data + 4 ,"-subaddr", 8)) {
+ if (!strncasecmp(data + 12 ,"-valid", 6)) { /* dnid-subaddr-valid */
+ chan->cid.dialed_subaddress.valid = atoi(value) ? 1 : 0;
+ } else if (!strncasecmp(data + 12 ,"-type", 5)) { /* dnid-subaddr-type */
+ chan->cid.dialed_subaddress.type = atoi(value) ? 2 : 0;
+ } else if (!strncasecmp(data + 12 ,"-odd", 4)) { /* dnid-subaddr-odd */
+ chan->cid.dialed_subaddress.odd_even_indicator = atoi(value) ? 1 : 0;
+ } else { /* dnid-subaddr */
+ if (chan->cid.dialed_subaddress.str) {
+ ast_free(chan->cid.dialed_subaddress.str);
+ }
+ chan->cid.dialed_subaddress.str = ast_strdup(value);
+ }
+ } else { /* dnid */
+ if (chan->cid.cid_dnid) {
+ ast_free(chan->cid.cid_dnid);
+ }
+ chan->cid.cid_dnid = ast_strdup(value);
+ }
+
+ if (chan->cdr) {
+ ast_cdr_setcid(chan->cdr, chan);
+ }
+ ast_channel_unlock(chan);
+ } else if (!strncasecmp("subaddr", data, 7)) {
+ ast_channel_lock(chan);
+ /* also matches subaddr-valid, subaddr-type, subaddr-odd, subaddr */
+ if (!strncasecmp(data + 7 ,"-valid", 6)) { /* subaddr-valid */
+ chan->cid.subaddress.valid = atoi(value) ? 1 : 0;
+ } else if (!strncasecmp(data + 7 ,"-type", 5)) { /* subaddr-type */
+ chan->cid.subaddress.type = atoi(value) ? 2 : 0;
+ } else if (!strncasecmp(data + 7 ,"-odd", 4)) { /* subaddr-odd */
+ chan->cid.subaddress.odd_even_indicator = atoi(value) ? 1 : 0;
+ } else { /* subaddr */
+ if (chan->cid.subaddress.str) {
+ ast_free(chan->cid.subaddress.str);
+ }
+ chan->cid.subaddress.str = ast_strdup(value);
}
- chan->cid.cid_dnid = ast_strdup(value);
if (chan->cdr) {
ast_cdr_setcid(chan->cdr, chan);
}