summaryrefslogtreecommitdiff
path: root/funcs/func_callerid.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-04-20 00:57:13 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-04-20 00:57:13 +0000
commit73f48997f90eda77c56fdefbf5f1e3346d2f86a7 (patch)
tree9a919c0fb4d0188db743e9b4e6c31f414305c993 /funcs/func_callerid.c
parent92ca507d72d96313fb834269db0e19ea28eff37a (diff)
Add original party id and reason support.
ISDN ETSI PTP and Q.SIG (And SS7 in future) have support for reporting who was the original redirecting party of a call. * Added support for the original redirecting party and reason to the REDIRECTING function and the system core as well as to the stubbed locations in sig_pri.c. Review: https://reviewboard.asterisk.org/r/1829/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@362779 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'funcs/func_callerid.c')
-rw-r--r--funcs/func_callerid.c99
1 files changed, 85 insertions, 14 deletions
diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c
index 067628353..f15e3676f 100644
--- a/funcs/func_callerid.c
+++ b/funcs/func_callerid.c
@@ -69,13 +69,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
* they are active at the same time. The plain pres option will simply
* live on as a historical relic.
*
- * Do not document the REDIRECTING(from-pres) or REDIRECTING(to-pres) datatypes.
- * The name and number now have their own presentation value. The from-pres
- * and to-pres options will simply live on as a historical relic with as best
- * as can be managed backward compatible meaning.
+ * Do not document the REDIRECTING(orig-pres), REDIRECTING(from-pres),
+ * or REDIRECTING(to-pres) datatypes.
+ * The name and number now have their own presentation value. The orig-pres,
+ * from-pres, and to-pres options will simply live on as a historical relic
+ * with as best as can be managed backward compatible meaning.
*
- * Do not document the REDIRECTING(from-ton) or REDIRECTING(to-ton) datatypes.
- * They are aliases for from-num-plan and to-num-plan respectively.
+ * Do not document the REDIRECTING(orig-ton), REDIRECTING(from-ton),
+ * or REDIRECTING(to-ton) datatypes.
+ * They are aliases for orig-num-plan, from-num-plan, and to-num-plan
+ * respectively.
*/
/*** DOCUMENTATION
<function name="CALLERID" language="en_US">
@@ -239,6 +242,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<parameter name="datatype" required="true">
<para>The allowable datatypes are:</para>
<enumlist>
+ <enum name = "orig-all" />
+ <enum name = "orig-name" />
+ <enum name = "orig-name-valid" />
+ <enum name = "orig-name-charset" />
+ <enum name = "orig-name-pres" />
+ <enum name = "orig-num" />
+ <enum name = "orig-num-valid" />
+ <enum name = "orig-num-plan" />
+ <enum name = "orig-num-pres" />
+ <enum name = "orig-subaddr" />
+ <enum name = "orig-subaddr-valid" />
+ <enum name = "orig-subaddr-type" />
+ <enum name = "orig-subaddr-odd" />
+ <enum name = "orig-tag" />
+ <enum name = "orig-reason" />
<enum name = "from-all" />
<enum name = "from-name" />
<enum name = "from-name-valid" />
@@ -279,7 +297,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<description>
<para>Gets or sets Redirecting data on the channel.</para>
<para>The allowable values for the <replaceable>reason</replaceable>
- field are the following:</para>
+ and <replaceable>orig-reason</replaceable> fields are the following:</para>
<enumlist>
<enum name = "unknown"><para>Unknown</para></enum>
<enum name = "cfb"><para>Call Forwarding Busy</para></enum>
@@ -1330,6 +1348,7 @@ static int redirecting_read(struct ast_channel *chan, const char *cmd, char *dat
{
struct ast_party_members member;
char *read_what;
+ const struct ast_party_redirecting *ast_redirecting;
enum ID_FIELD_STATUS status;
/* Ensure that the buffer is empty */
@@ -1348,9 +1367,26 @@ static int redirecting_read(struct ast_channel *chan, const char *cmd, char *dat
ast_channel_lock(chan);
- if (!strcasecmp("from", member.argv[0])) {
+ ast_redirecting = ast_channel_redirecting(chan);
+ if (!strcasecmp("orig", member.argv[0])) {
+ if (member.argc == 2 && !strcasecmp("reason", member.argv[1])) {
+ ast_copy_string(buf,
+ ast_redirecting_reason_name(ast_redirecting->orig_reason), len);
+ } else {
+ status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
+ &ast_redirecting->orig);
+ switch (status) {
+ case ID_FIELD_VALID:
+ case ID_FIELD_INVALID:
+ break;
+ default:
+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
+ break;
+ }
+ }
+ } else if (!strcasecmp("from", member.argv[0])) {
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
- &ast_channel_redirecting(chan)->from);
+ &ast_redirecting->from);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
@@ -1361,7 +1397,7 @@ static int redirecting_read(struct ast_channel *chan, const char *cmd, char *dat
}
} else if (!strcasecmp("to", member.argv[0])) {
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
- &ast_channel_redirecting(chan)->to);
+ &ast_redirecting->to);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
@@ -1377,11 +1413,11 @@ static int redirecting_read(struct ast_channel *chan, const char *cmd, char *dat
*/
ast_copy_string(buf,
ast_named_caller_presentation(
- ast_party_id_presentation(&ast_channel_redirecting(chan)->from)), len);
+ ast_party_id_presentation(&ast_redirecting->from)), len);
} else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
- ast_copy_string(buf, ast_redirecting_reason_name(ast_channel_redirecting(chan)->reason), len);
+ ast_copy_string(buf, ast_redirecting_reason_name(ast_redirecting->reason), len);
} else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
- snprintf(buf, len, "%d", ast_channel_redirecting(chan)->count);
+ snprintf(buf, len, "%d", ast_redirecting->count);
} else {
ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
}
@@ -1450,7 +1486,42 @@ static int redirecting_write(struct ast_channel *chan, const char *cmd, char *da
value = ast_skip_blanks(value);
- if (!strcasecmp("from", member.argv[0])) {
+ if (!strcasecmp("orig", member.argv[0])) {
+ if (member.argc == 2 && !strcasecmp("reason", member.argv[1])) {
+ 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 orig reason '%s', value unchanged\n", val);
+ } else {
+ redirecting.orig_reason = reason;
+ set_it(chan, &redirecting, NULL);
+ }
+ } else {
+ status = party_id_write(&redirecting.orig, member.argc - 1, member.argv + 1,
+ value);
+ switch (status) {
+ case ID_FIELD_VALID:
+ set_it(chan, &redirecting, NULL);
+ break;
+ case ID_FIELD_INVALID:
+ break;
+ default:
+ ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
+ break;
+ }
+ ast_party_redirecting_free(&redirecting);
+ }
+ } else if (!strcasecmp("from", member.argv[0])) {
status = party_id_write(&redirecting.from, member.argc - 1, member.argv + 1,
value);
switch (status) {