From e19e560da2cd5e8bbfe03afc6bb360ac764357d1 Mon Sep 17 00:00:00 2001 From: tilghman Date: Fri, 23 Dec 2005 21:03:25 +0000 Subject: [PATCH] Bug 5327 - new function FILTER and optional argument to CALLERID git-svn-id: http://svn.digium.com/svn/asterisk/trunk@7614 f38db490-d61c-443f-a65b-d21fe96a405b --- funcs/Makefile | 2 +- funcs/func_callerid.c | 69 +++++++++++++++++++++++++++---------------- funcs/func_strings.c | 38 ++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 26 deletions(-) diff --git a/funcs/Makefile b/funcs/Makefile index aa11c2059..1934be5ab 100644 --- a/funcs/Makefile +++ b/funcs/Makefile @@ -37,7 +37,7 @@ FUNCS+=$(STANDALONE_FUNCS:.o=.so) FUNC_SOURCES=$(BUILTINS:.o=.c) -FUNC_STRUCTS=$(shell grep 'struct ast_custom_function' $(FUNC_SOURCES) | awk '{print $$3};') +FUNC_STRUCTS=$(shell grep 'struct ast_custom_function' $(FUNC_SOURCES) | awk '{print $$3};' | sort) ifeq (${OSARCH},CYGWIN) CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 264c404dd..fdaaf632d 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -42,32 +42,50 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { - if (!strncasecmp("all", data, 3)) { - snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : ""); - } else if (!strncasecmp("name", data, 4)) { - if (chan->cid.cid_name) { - ast_copy_string(buf, chan->cid.cid_name, len); - } - } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) { - if (chan->cid.cid_num) { - ast_copy_string(buf, chan->cid.cid_num, len); - } - } else if (!strncasecmp("ani", data, 3)) { - if (chan->cid.cid_ani) { - 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); - } - } else if (!strncasecmp("rdnis", data, 5)) { - if (chan->cid.cid_rdnis) { - ast_copy_string(buf, chan->cid.cid_rdnis, len); + char *opt = data; + + if (strchr(opt, '|')) { + char name[80], num[80]; + + data = strsep(&opt, "|"); + ast_callerid_split(opt, name, sizeof(name), num, sizeof(num)); + + if (!strncasecmp("all", data, 3)) { + snprintf(buf, len, "\"%s\" <%s>", name, num); + } else if (!strncasecmp("name", data, 4)) { + ast_copy_string(buf, name, len); + } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) { + ast_copy_string(buf, num, len); + } else { + ast_log(LOG_ERROR, "Unknown callerid data type.\n"); } } else { - ast_log(LOG_ERROR, "Unknown callerid data type.\n"); + if (!strncasecmp("all", data, 3)) { + snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : ""); + } else if (!strncasecmp("name", data, 4)) { + if (chan->cid.cid_name) { + ast_copy_string(buf, chan->cid.cid_name, len); + } + } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) { + if (chan->cid.cid_num) { + ast_copy_string(buf, chan->cid.cid_num, len); + } + } else if (!strncasecmp("ani", data, 3)) { + if (chan->cid.cid_ani) { + 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); + } + } else if (!strncasecmp("rdnis", data, 5)) { + if (chan->cid.cid_rdnis) { + ast_copy_string(buf, chan->cid.cid_rdnis, len); + } + } else { + ast_log(LOG_ERROR, "Unknown callerid data type.\n"); + } } - return buf; } @@ -108,9 +126,10 @@ static struct ast_custom_function callerid_function = { .name = "CALLERID", .synopsis = "Gets or sets Caller*ID data on the channel.", - .syntax = "CALLERID(datatype)", + .syntax = "CALLERID(datatype[,])", .desc = "Gets or sets Caller*ID data on the channel. The allowable datatypes\n" - "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n", + "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n" + "Uses channel callerid by default or optional callerid, if specified.\n", .read = callerid_read, .write = callerid_write, }; diff --git a/funcs/func_strings.c b/funcs/func_strings.c index 91564d9e4..b9c45014e 100644 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -68,6 +68,44 @@ struct ast_custom_function fieldqty_function = { .read = function_fieldqty, }; +static char *builtin_function_filter(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) +{ + char *allowed, *string, *outbuf=buf; + + string = ast_strdupa(data); + if (!string) { + ast_log(LOG_ERROR, "Out of memory"); + return ""; + } + + allowed = strsep(&string, "|"); + + if (!string) { + ast_log(LOG_ERROR, "Usage: FILTER(,)\n"); + return ""; + } + + for ( ; *string && (buf + len - 1 > outbuf); string++) { + if (strchr(allowed, *string)) { + *outbuf = *string; + outbuf++; + } + } + *outbuf = '\0'; + + return buf; +} + +#ifndef BUILTIN_FUNC +static +#endif +struct ast_custom_function filter_function = { + .name = "FILTER", + .synopsis = "Filter the string to include only the allowed characters", + .syntax = "FILTER(,)", + .read = builtin_function_filter, +}; + static char *builtin_function_regex(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { char *arg, *earg = NULL, *tmp, errstr[256] = "";