Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting) More...
#include "asterisk.h"#include "asterisk/module.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/utils.h"#include "asterisk/app.h"#include "asterisk/callerid.h"
Go to the source code of this file.
Data Structures | |
| struct | ast_party_func_args |
| struct | ast_party_members |
Enumerations | |
| enum | CONNECTED_LINE_OPT_ARGS { CONNECTED_LINE_OPT_DUMMY, CONNECTED_LINE_OPT_ARG_ARRAY_SIZE } |
| enum | CONNECTED_LINE_OPT_FLAGS { CONNECTED_LINE_OPT_INHIBIT = (1 << 0) } |
| enum | ID_FIELD_STATUS { ID_FIELD_VALID, ID_FIELD_INVALID, ID_FIELD_UNKNOWN } |
| enum | REDIRECTING_OPT_ARGS { REDIRECTING_OPT_DUMMY, REDIRECTING_OPT_ARG_ARRAY_SIZE } |
| enum | REDIRECTING_OPT_FLAGS { REDIRECTING_OPT_INHIBIT = (1 << 0) } |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | callerid_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | callerid_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | callerpres_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | callerpres_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | connectedline_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | connectedline_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | load_module (void) |
| static enum ID_FIELD_STATUS | party_id_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_id *id) |
| static enum ID_FIELD_STATUS | party_id_write (struct ast_party_id *id, int argc, char *argv[], const char *value) |
| static enum ID_FIELD_STATUS | party_name_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_name *name) |
| static enum ID_FIELD_STATUS | party_name_write (struct ast_party_name *name, int argc, char *argv[], const char *value) |
| static enum ID_FIELD_STATUS | party_number_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_number *number) |
| static enum ID_FIELD_STATUS | party_number_write (struct ast_party_number *number, int argc, char *argv[], const char *value) |
| static enum ID_FIELD_STATUS | party_subaddress_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_subaddress *subaddress) |
| static enum ID_FIELD_STATUS | party_subaddress_write (struct ast_party_subaddress *subaddress, int argc, char *argv[], const char *value) |
| static int | redirecting_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | redirecting_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_custom_function | callerid_function |
| static int | callerpres_deprecate_notify |
| static struct ast_custom_function | callerpres_function |
| static struct ast_custom_function | connectedline_function |
| static struct ast_app_option | connectedline_opts [128] = { [ 'i' ] = { .flag = CONNECTED_LINE_OPT_INHIBIT }, } |
| static struct ast_custom_function | redirecting_function |
| static struct ast_app_option | redirecting_opts [128] = { [ 'i' ] = { .flag = REDIRECTING_OPT_INHIBIT }, } |
Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)
See Also:
Definition in file func_callerid.c.
| CONNECTED_LINE_OPT_DUMMY |
Delete this if CONNECTED_LINE ever gets an option with parameters. |
| CONNECTED_LINE_OPT_ARG_ARRAY_SIZE |
|
Definition at line 422 of file func_callerid.c.
{
CONNECTED_LINE_OPT_DUMMY, /*!< Delete this if CONNECTED_LINE ever gets an option with parameters. */
/*! \note This entry _MUST_ be the last one in the enum */
CONNECTED_LINE_OPT_ARG_ARRAY_SIZE
};
Definition at line 419 of file func_callerid.c.
{
CONNECTED_LINE_OPT_INHIBIT = (1 << 0),
};
| enum ID_FIELD_STATUS |
Definition at line 403 of file func_callerid.c.
| enum REDIRECTING_OPT_ARGS |
| REDIRECTING_OPT_DUMMY |
Delete this if REDIRECTING ever gets an option with parameters. |
| REDIRECTING_OPT_ARG_ARRAY_SIZE |
|
Definition at line 436 of file func_callerid.c.
{
REDIRECTING_OPT_DUMMY, /*!< Delete this if REDIRECTING ever gets an option with parameters. */
/*! \note This entry _MUST_ be the last one in the enum */
REDIRECTING_OPT_ARG_ARRAY_SIZE
};
Definition at line 433 of file func_callerid.c.
{
REDIRECTING_OPT_INHIBIT = (1 << 0),
};
| static void __reg_module | ( | void | ) | [static] |
Definition at line 1885 of file func_callerid.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 1885 of file func_callerid.c.
| static int callerid_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
< Member name
< Optional caller id to parse instead of from the channel.
Definition at line 968 of file func_callerid.c.
References ast_party_members::argc, args, ast_party_members::argv, ARRAY_LEN, AST_APP_ARG, ast_callerid_split(), ast_channel_caller(), ast_channel_dialed(), ast_channel_lock, ast_channel_redirecting(), ast_channel_unlock, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, AST_STANDARD_APP_ARGS, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, name, party_id_read(), party_subaddress_read(), status, and ast_party_members::subnames.
{
char *parms;
struct ast_party_members member;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(member); /*!< Member name */
AST_APP_ARG(cid); /*!< Optional caller id to parse instead of from the channel. */
);
/* Ensure that the buffer is empty */
*buf = 0;
if (!chan) {
return -1;
}
parms = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parms);
if (args.argc == 0) {
/* Must have at least one argument. */
return -1;
}
AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
if (args.argc == 2) {
char name[80];
char num[80];
ast_callerid_split(args.cid, name, sizeof(name), num, sizeof(num));
if (member.argc == 1 && !strcasecmp("all", member.argv[0])) {
snprintf(buf, len, "\"%s\" <%s>", name, num);
} else if (member.argc == 1 && !strcasecmp("name", member.argv[0])) {
ast_copy_string(buf, name, len);
} else if (member.argc == 1 && !strncasecmp("num", member.argv[0], 3)) {
/* Accept num[ber] */
ast_copy_string(buf, num, len);
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
} else {
enum ID_FIELD_STATUS status;
ast_channel_lock(chan);
if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
if (ast_channel_redirecting(chan)->from.number.valid
&& ast_channel_redirecting(chan)->from.number.str) {
ast_copy_string(buf, ast_channel_redirecting(chan)->from.number.str, len);
}
} else if (!strcasecmp("dnid", member.argv[0])) {
if (member.argc == 1) {
/* Setup as if user had given dnid-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
if (!strncasecmp("num", member.argv[1], 3)) {
/*
* Accept num[ber]
* dnid-num...
*/
if (member.argc == 2) {
/* dnid-num */
if (ast_channel_dialed(chan)->number.str) {
ast_copy_string(buf, ast_channel_dialed(chan)->number.str, len);
}
} else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
/* dnid-num-plan */
snprintf(buf, len, "%d", ast_channel_dialed(chan)->number.plan);
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
} else if (!strncasecmp("subaddr", member.argv[1], 7)) {
/*
* Accept subaddr[ess]
* dnid-subaddr...
*/
status = party_subaddress_read(buf, len, member.argc - 2, member.argv + 2,
&ast_channel_dialed(chan)->subaddress);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
} else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
snprintf(buf, len, "%d", ast_channel_caller(chan)->ani2);
} else if (!strcasecmp("ani", member.argv[0])) {
if (member.argc == 1) {
/* Setup as if user had given ani-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
&ast_channel_caller(chan)->ani);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
} else if (!strcasecmp("priv", member.argv[0])) {
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
&ast_channel_caller(chan)->priv);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
} else {
status = party_id_read(buf, len, member.argc, member.argv, &ast_channel_caller(chan)->id);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
}
ast_channel_unlock(chan);
}
return 0;
}
| static int callerid_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 1121 of file func_callerid.c.
References ast_party_caller::ani, ast_party_caller::ani2, ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_cdr_setcid(), ast_channel_caller(), ast_channel_cdr(), ast_channel_dialed(), ast_channel_lock, ast_channel_redirecting(), ast_channel_set_caller_event(), ast_channel_unlock, ast_free, ast_log(), AST_NONSTANDARD_APP_ARGS, ast_party_caller_free(), ast_party_caller_set(), ast_party_caller_set_init(), ast_party_dialed_free(), ast_party_dialed_set(), ast_party_dialed_set_init(), ast_skip_blanks(), AST_STANDARD_APP_ARGS, ast_strdup, ast_trim_blanks(), ast_party_redirecting::from, ast_party_caller::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_func_args::member, ast_party_id::number, ast_party_dialed::number, party_id_write(), party_subaddress_write(), ast_party_dialed::plan, ast_party_caller::priv, status, ast_party_number::str, ast_party_dialed::str, ast_party_dialed::subaddress, ast_party_members::subnames, and ast_party_number::valid.
{
struct ast_party_caller caller;
struct ast_party_dialed dialed;
enum ID_FIELD_STATUS status;
char *val;
char *parms;
struct ast_party_func_args args;
struct ast_party_members member;
if (!value || !chan) {
return -1;
}
parms = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parms);
if (args.argc == 0) {
/* Must have at least one argument. */
return -1;
}
AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
value = ast_skip_blanks(value);
ast_channel_lock(chan);
if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
ast_channel_redirecting(chan)->from.number.valid = 1;
ast_free(ast_channel_redirecting(chan)->from.number.str);
ast_channel_redirecting(chan)->from.number.str = ast_strdup(value);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
} else if (!strcasecmp("dnid", member.argv[0])) {
ast_party_dialed_set_init(&dialed, ast_channel_dialed(chan));
if (member.argc == 1) {
/* Setup as if user had given dnid-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
if (!strncasecmp("num", member.argv[1], 3)) {
/*
* Accept num[ber]
* dnid-num...
*/
if (member.argc == 2) {
/* dnid-num */
dialed.number.str = ast_strdup(value);
ast_trim_blanks(dialed.number.str);
ast_party_dialed_set(ast_channel_dialed(chan), &dialed);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
} else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
/* dnid-num-plan */
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
ast_channel_dialed(chan)->number.plan = atoi(val);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
} else {
ast_log(LOG_ERROR,
"Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
}
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
} else if (!strncasecmp("subaddr", member.argv[1], 7)) {
/*
* Accept subaddr[ess]
* dnid-subaddr...
*/
status = party_subaddress_write(&dialed.subaddress, member.argc - 2,
member.argv + 2, value);
switch (status) {
case ID_FIELD_VALID:
ast_party_dialed_set(ast_channel_dialed(chan), &dialed);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
} else {
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
}
ast_party_dialed_free(&dialed);
} else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
ast_channel_caller(chan)->ani2 = atoi(val);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
} else {
ast_log(LOG_ERROR, "Unknown callerid ani2 '%s', value unchanged\n", val);
}
} else if (!strcasecmp("ani", member.argv[0])) {
ast_party_caller_set_init(&caller, ast_channel_caller(chan));
if (member.argc == 1) {
/* Setup as if user had given ani-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
status = party_id_write(&caller.ani, member.argc - 1, member.argv + 1, value);
switch (status) {
case ID_FIELD_VALID:
ast_party_caller_set(ast_channel_caller(chan), &caller, NULL);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
ast_party_caller_free(&caller);
} else if (!strcasecmp("priv", member.argv[0])) {
ast_party_caller_set_init(&caller, ast_channel_caller(chan));
status = party_id_write(&caller.priv, member.argc - 1, member.argv + 1, value);
switch (status) {
case ID_FIELD_VALID:
ast_party_caller_set(ast_channel_caller(chan), &caller, NULL);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
ast_party_caller_free(&caller);
} else {
ast_party_caller_set_init(&caller, ast_channel_caller(chan));
status = party_id_write(&caller.id, member.argc, member.argv, value);
switch (status) {
case ID_FIELD_VALID:
ast_channel_set_caller_event(chan, &caller, NULL);
if (ast_channel_cdr(chan)) {
ast_cdr_setcid(ast_channel_cdr(chan), chan);
}
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
}
ast_party_caller_free(&caller);
}
ast_channel_unlock(chan);
return 0;
}
| static int callerpres_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 901 of file func_callerid.c.
References ast_channel_caller(), ast_copy_string(), ast_log(), ast_named_caller_presentation(), ast_party_id_presentation(), and LOG_WARNING.
{
if (!chan) {
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
return -1;
}
if (!callerpres_deprecate_notify) {
callerpres_deprecate_notify = 1;
ast_log(LOG_WARNING, "CALLERPRES is deprecated."
" Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
}
ast_copy_string(buf,
ast_named_caller_presentation(ast_party_id_presentation(&ast_channel_caller(chan)->id)), len);
return 0;
}
| static int callerpres_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 930 of file func_callerid.c.
References ast_channel_caller(), ast_log(), ast_parse_caller_presentation(), ast_party_caller::id, LOG_WARNING, ast_party_id::name, ast_party_id::number, ast_party_name::presentation, and ast_party_number::presentation.
{
int pres;
if (!chan) {
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
return -1;
}
if (!callerpres_deprecate_notify) {
callerpres_deprecate_notify = 1;
ast_log(LOG_WARNING, "CALLERPRES is deprecated."
" Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
}
pres = ast_parse_caller_presentation(value);
if (pres < 0) {
ast_log(LOG_WARNING, "'%s' is not a valid presentation (see 'show function CALLERPRES')\n", value);
} else {
ast_channel_caller(chan)->id.name.presentation = pres;
ast_channel_caller(chan)->id.number.presentation = pres;
}
return 0;
}
| static int connectedline_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 1306 of file func_callerid.c.
References ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_channel_connected(), ast_channel_lock, ast_channel_unlock, ast_connected_line_source_name(), ast_copy_string(), ast_log(), AST_NONSTANDARD_APP_ARGS, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, party_id_read(), status, and ast_party_members::subnames.
{
struct ast_party_members member;
char *read_what;
enum ID_FIELD_STATUS status;
/* Ensure that the buffer is empty */
*buf = 0;
if (!chan) {
return -1;
}
read_what = ast_strdupa(data);
AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
ast_channel_lock(chan);
if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
ast_copy_string(buf, ast_connected_line_source_name(ast_channel_connected(chan)->source), len);
} else if (!strcasecmp("priv", member.argv[0])) {
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
&ast_channel_connected(chan)->priv);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
break;
}
} else {
status = party_id_read(buf, len, member.argc, member.argv, &ast_channel_connected(chan)->id);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
break;
}
}
ast_channel_unlock(chan);
return 0;
}
| static int connectedline_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 1370 of file func_callerid.c.
References ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_app_parse_options(), ast_channel_connected(), ast_channel_lock, ast_channel_set_connected_line(), ast_channel_unlock, ast_channel_update_connected_line(), ast_connected_line_source_parse(), ast_log(), AST_NONSTANDARD_APP_ARGS, ast_party_connected_line_free(), ast_party_connected_line_set_init(), ast_skip_blanks(), AST_STANDARD_APP_ARGS, ast_test_flag, ast_trim_blanks(), connected, CONNECTED_LINE_OPT_ARG_ARRAY_SIZE, CONNECTED_LINE_OPT_INHIBIT, connectedline_opts, ast_party_connected_line::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_func_args::member, ast_party_func_args::opts, party_id_write(), ast_party_connected_line::priv, ast_party_connected_line::source, status, ast_party_members::subnames, and update().
{
struct ast_party_connected_line connected;
char *val;
char *parms;
void (*set_it)(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update);
struct ast_party_func_args args;
struct ast_party_members member;
struct ast_flags opts;
char *opt_args[CONNECTED_LINE_OPT_ARG_ARRAY_SIZE];
enum ID_FIELD_STATUS status;
if (!value || !chan) {
return -1;
}
parms = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parms);
if (args.argc == 0) {
/* Must have at least one argument. */
return -1;
}
AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
if (ast_app_parse_options(connectedline_opts, &opts, opt_args, args.opts)) {
/* General invalid option syntax. */
return -1;
}
/* Determine if the update indication inhibit option is present */
if (ast_test_flag(&opts, CONNECTED_LINE_OPT_INHIBIT)) {
set_it = ast_channel_set_connected_line;
} else {
set_it = ast_channel_update_connected_line;
}
ast_channel_lock(chan);
ast_party_connected_line_set_init(&connected, ast_channel_connected(chan));
ast_channel_unlock(chan);
value = ast_skip_blanks(value);
if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
int source;
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
source = atoi(val);
} else {
source = ast_connected_line_source_parse(val);
}
if (source < 0) {
ast_log(LOG_ERROR, "Unknown connectedline source '%s', value unchanged\n", val);
} else {
connected.source = source;
set_it(chan, &connected, NULL);
}
} else if (!strcasecmp("priv", member.argv[0])) {
status = party_id_write(&connected.priv, member.argc - 1, member.argv + 1, value);
switch (status) {
case ID_FIELD_VALID:
set_it(chan, &connected, NULL);
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
break;
}
ast_party_connected_line_free(&connected);
} else {
status = party_id_write(&connected.id, member.argc, member.argv, value);
switch (status) {
case ID_FIELD_VALID:
set_it(chan, &connected, NULL);
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
break;
}
ast_party_connected_line_free(&connected);
}
return 0;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 1873 of file func_callerid.c.
References ast_custom_function_register, AST_MODULE_LOAD_DECLINE, and AST_MODULE_LOAD_SUCCESS.
{
int res;
res = ast_custom_function_register(&callerpres_function);
res |= ast_custom_function_register(&callerid_function);
res |= ast_custom_function_register(&connectedline_function);
res |= ast_custom_function_register(&redirecting_function);
return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
}
| static enum ID_FIELD_STATUS party_id_read | ( | char * | buf, |
| size_t | len, | ||
| int | argc, | ||
| char * | argv[], | ||
| const struct ast_party_id * | id | ||
| ) | [static] |
Definition at line 577 of file func_callerid.c.
References ast_copy_string(), ast_named_caller_presentation(), ast_party_id_presentation(), ID_FIELD_UNKNOWN, ID_FIELD_VALID, ast_party_id::name, ast_party_id::number, party_name_read(), party_number_read(), party_subaddress_read(), ast_party_number::plan, S_COR, status, ast_party_name::str, ast_party_number::str, ast_party_id::subaddress, ast_party_id::tag, ast_party_name::valid, and ast_party_number::valid.
Referenced by callerid_read(), connectedline_read(), and redirecting_read().
{
enum ID_FIELD_STATUS status;
if (argc == 0) {
/* Must have at least one subname. */
return ID_FIELD_UNKNOWN;
}
status = ID_FIELD_VALID;
if (argc == 1 && !strcasecmp("all", argv[0])) {
snprintf(buf, len, "\"%s\" <%s>",
S_COR(id->name.valid, id->name.str, ""),
S_COR(id->number.valid, id->number.str, ""));
} else if (!strcasecmp("name", argv[0])) {
status = party_name_read(buf, len, argc - 1, argv + 1, &id->name);
} else if (!strncasecmp("num", argv[0], 3)) {
/* Accept num[ber] */
status = party_number_read(buf, len, argc - 1, argv + 1, &id->number);
} else if (!strncasecmp("subaddr", argv[0], 7)) {
/* Accept subaddr[ess] */
status = party_subaddress_read(buf, len, argc - 1, argv + 1, &id->subaddress);
} else if (argc == 1 && !strcasecmp("tag", argv[0])) {
if (id->tag) {
ast_copy_string(buf, id->tag, len);
}
} else if (argc == 1 && !strcasecmp("ton", argv[0])) {
/* ton is an alias for num-plan */
snprintf(buf, len, "%d", id->number.plan);
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
/*
* Accept pres[entation]
* This is the combined name/number presentation.
*/
ast_copy_string(buf,
ast_named_caller_presentation(ast_party_id_presentation(id)), len);
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_id_write | ( | struct ast_party_id * | id, |
| int | argc, | ||
| char * | argv[], | ||
| const char * | value | ||
| ) | [static] |
Definition at line 812 of file func_callerid.c.
References ast_callerid_split(), ast_log(), ast_parse_caller_presentation(), ast_strdup, ast_trim_blanks(), ID_FIELD_INVALID, ID_FIELD_UNKNOWN, ID_FIELD_VALID, LOG_ERROR, name, ast_party_id::name, ast_party_id::number, party_name_write(), party_number_write(), party_subaddress_write(), status, ast_party_name::str, ast_party_number::str, ast_party_id::subaddress, and ast_party_id::tag.
Referenced by callerid_write(), connectedline_write(), and redirecting_write().
{
char *val;
enum ID_FIELD_STATUS status;
if (argc == 0) {
/* Must have at least one subname. */
return ID_FIELD_UNKNOWN;
}
status = ID_FIELD_VALID;
if (argc == 1 && !strcasecmp("all", argv[0])) {
char name[256];
char num[256];
ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
id->name.valid = 1;
id->name.str = ast_strdup(name);
if (!id->name.str) {
return ID_FIELD_INVALID;
}
id->number.valid = 1;
id->number.str = ast_strdup(num);
if (!id->number.str) {
return ID_FIELD_INVALID;
}
} else if (!strcasecmp("name", argv[0])) {
status = party_name_write(&id->name, argc - 1, argv + 1, value);
} else if (!strncasecmp("num", argv[0], 3)) {
/* Accept num[ber] */
status = party_number_write(&id->number, argc - 1, argv + 1, value);
} else if (!strncasecmp("subaddr", argv[0], 7)) {
/* Accept subaddr[ess] */
status = party_subaddress_write(&id->subaddress, argc - 1, argv + 1, value);
} else if (argc == 1 && !strcasecmp("tag", argv[0])) {
id->tag = ast_strdup(value);
ast_trim_blanks(id->tag);
} else if (argc == 1 && !strcasecmp("ton", argv[0])) {
/* ton is an alias for num-plan */
argv[0] = "plan";
status = party_number_write(&id->number, argc, argv, value);
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
int pres;
/*
* Accept pres[entation]
* This is the combined name/number presentation.
*/
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
pres = atoi(val);
} else {
pres = ast_parse_caller_presentation(val);
}
if (pres < 0) {
ast_log(LOG_ERROR,
"Unknown combined presentation '%s', value unchanged\n", val);
status = ID_FIELD_INVALID;
} else {
id->name.presentation = pres;
id->number.presentation = pres;
}
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_name_read | ( | char * | buf, |
| size_t | len, | ||
| int | argc, | ||
| char * | argv[], | ||
| const struct ast_party_name * | name | ||
| ) | [static] |
Definition at line 461 of file func_callerid.c.
References ast_copy_string(), ast_named_caller_presentation(), ast_party_name_charset_str(), ast_party_name::char_set, ID_FIELD_UNKNOWN, ID_FIELD_VALID, ast_party_name::presentation, status, ast_party_name::str, and ast_party_name::valid.
Referenced by party_id_read().
{
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We want the name string */
if (name->valid && name->str) {
ast_copy_string(buf, name->str, len);
}
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
snprintf(buf, len, "%d", name->valid);
} else if (argc == 1 && !strcasecmp("charset", argv[0])) {
ast_copy_string(buf, ast_party_name_charset_str(name->char_set), len);
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
/* Accept pres[entation] */
ast_copy_string(buf, ast_named_caller_presentation(name->presentation), len);
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_name_write | ( | struct ast_party_name * | name, |
| int | argc, | ||
| char * | argv[], | ||
| const char * | value | ||
| ) | [static] |
Definition at line 635 of file func_callerid.c.
References ast_log(), ast_parse_caller_presentation(), ast_party_name_charset_parse(), ast_strdup, ast_trim_blanks(), ast_party_name::char_set, ID_FIELD_INVALID, ID_FIELD_UNKNOWN, ID_FIELD_VALID, LOG_ERROR, ast_party_name::presentation, status, ast_party_name::str, and ast_party_name::valid.
Referenced by party_id_write().
{
char *val;
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We are setting the name string */
name->valid = 1;
name->str = ast_strdup(value);
ast_trim_blanks(name->str);
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
name->valid = atoi(value) ? 1 : 0;
} else if (argc == 1 && !strcasecmp("charset", argv[0])) {
int char_set;
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
char_set = atoi(val);
} else {
char_set = ast_party_name_charset_parse(val);
}
if (char_set < 0) {
ast_log(LOG_ERROR,
"Unknown name char-set '%s', value unchanged\n", val);
status = ID_FIELD_INVALID;
} else {
name->char_set = char_set;
}
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
int pres;
/* Accept pres[entation] */
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
pres = atoi(val);
} else {
pres = ast_parse_caller_presentation(val);
}
if (pres < 0) {
ast_log(LOG_ERROR,
"Unknown name presentation '%s', value unchanged\n", val);
status = ID_FIELD_INVALID;
} else {
name->presentation = pres;
}
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_number_read | ( | char * | buf, |
| size_t | len, | ||
| int | argc, | ||
| char * | argv[], | ||
| const struct ast_party_number * | number | ||
| ) | [static] |
Definition at line 500 of file func_callerid.c.
References ast_copy_string(), ast_named_caller_presentation(), ID_FIELD_UNKNOWN, ID_FIELD_VALID, ast_party_number::plan, ast_party_number::presentation, status, ast_party_number::str, and ast_party_number::valid.
Referenced by party_id_read().
{
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We want the number string */
if (number->valid && number->str) {
ast_copy_string(buf, number->str, len);
}
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
snprintf(buf, len, "%d", number->valid);
} else if (argc == 1 && !strcasecmp("plan", argv[0])) {
snprintf(buf, len, "%d", number->plan);
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
/* Accept pres[entation] */
ast_copy_string(buf, ast_named_caller_presentation(number->presentation), len);
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_number_write | ( | struct ast_party_number * | number, |
| int | argc, | ||
| char * | argv[], | ||
| const char * | value | ||
| ) | [static] |
Definition at line 709 of file func_callerid.c.
References ast_log(), ast_parse_caller_presentation(), ast_strdup, ast_trim_blanks(), ID_FIELD_INVALID, ID_FIELD_UNKNOWN, ID_FIELD_VALID, LOG_ERROR, ast_party_number::plan, ast_party_number::presentation, status, ast_party_number::str, and ast_party_number::valid.
Referenced by party_id_write().
{
char *val;
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We are setting the number string */
number->valid = 1;
number->str = ast_strdup(value);
ast_trim_blanks(number->str);
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
number->valid = atoi(value) ? 1 : 0;
} else if (argc == 1 && !strcasecmp("plan", argv[0])) {
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
number->plan = atoi(val);
} else {
ast_log(LOG_ERROR,
"Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
status = ID_FIELD_INVALID;
}
} else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
int pres;
/* Accept pres[entation] */
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
pres = atoi(val);
} else {
pres = ast_parse_caller_presentation(val);
}
if (pres < 0) {
ast_log(LOG_ERROR,
"Unknown number presentation '%s', value unchanged\n", val);
status = ID_FIELD_INVALID;
} else {
number->presentation = pres;
}
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_subaddress_read | ( | char * | buf, |
| size_t | len, | ||
| int | argc, | ||
| char * | argv[], | ||
| const struct ast_party_subaddress * | subaddress | ||
| ) | [static] |
Definition at line 539 of file func_callerid.c.
References ast_copy_string(), ID_FIELD_UNKNOWN, ID_FIELD_VALID, ast_party_subaddress::odd_even_indicator, status, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.
Referenced by callerid_read(), and party_id_read().
{
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We want the subaddress string */
if (subaddress->str) {
ast_copy_string(buf, subaddress->str, len);
}
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
snprintf(buf, len, "%d", subaddress->valid);
} else if (argc == 1 && !strcasecmp("type", argv[0])) {
snprintf(buf, len, "%d", subaddress->type);
} else if (argc == 1 && !strcasecmp("odd", argv[0])) {
snprintf(buf, len, "%d", subaddress->odd_even_indicator);
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static enum ID_FIELD_STATUS party_subaddress_write | ( | struct ast_party_subaddress * | subaddress, |
| int | argc, | ||
| char * | argv[], | ||
| const char * | value | ||
| ) | [static] |
Definition at line 775 of file func_callerid.c.
References ast_strdup, ast_trim_blanks(), ID_FIELD_UNKNOWN, ID_FIELD_VALID, ast_party_subaddress::odd_even_indicator, status, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.
Referenced by callerid_write(), and party_id_write().
{
enum ID_FIELD_STATUS status;
status = ID_FIELD_VALID;
if (argc == 0) {
/* We are setting the subaddress string */
subaddress->str = ast_strdup(value);
ast_trim_blanks(subaddress->str);
} else if (argc == 1 && !strcasecmp("valid", argv[0])) {
subaddress->valid = atoi(value) ? 1 : 0;
} else if (argc == 1 && !strcasecmp("type", argv[0])) {
subaddress->type = atoi(value) ? 2 : 0;
} else if (argc == 1 && !strcasecmp("odd", argv[0])) {
subaddress->odd_even_indicator = atoi(value) ? 1 : 0;
} else {
status = ID_FIELD_UNKNOWN;
}
return status;
}
| static int redirecting_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 1479 of file func_callerid.c.
References ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_channel_lock, ast_channel_redirecting(), ast_channel_unlock, ast_copy_string(), ast_log(), ast_named_caller_presentation(), AST_NONSTANDARD_APP_ARGS, ast_party_id_presentation(), ast_redirecting_reason_name(), ast_party_redirecting::count, ast_party_redirecting::from, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, party_id_read(), ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, status, ast_party_members::subnames, and ast_party_redirecting::to.
{
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 */
*buf = 0;
if (!chan) {
return -1;
}
read_what = ast_strdupa(data);
AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
ast_channel_lock(chan);
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_redirecting->from);
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("to", member.argv[0])) {
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
&ast_redirecting->to);
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 (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
/*
* Accept pres[entation]
* This is the combined from name/number presentation.
*/
ast_copy_string(buf,
ast_named_caller_presentation(
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_redirecting->reason), len);
} else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
snprintf(buf, len, "%d", ast_redirecting->count);
} else if (1 < member.argc && !strcasecmp("priv", member.argv[0])) {
if (!strcasecmp("orig", member.argv[1])) {
status = party_id_read(buf, len, member.argc - 2, member.argv + 2,
&ast_redirecting->priv_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[1])) {
status = party_id_read(buf, len, member.argc - 2, member.argv + 2,
&ast_redirecting->priv_from);
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("to", member.argv[1])) {
status = party_id_read(buf, len, member.argc - 2, member.argv + 2,
&ast_redirecting->priv_to);
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 {
ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
}
} else {
ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
}
ast_channel_unlock(chan);
return 0;
}
| static int redirecting_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 1611 of file func_callerid.c.
References ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_app_parse_options(), ast_channel_lock, ast_channel_redirecting(), ast_channel_set_redirecting(), ast_channel_unlock, ast_channel_update_redirecting(), ast_log(), AST_NONSTANDARD_APP_ARGS, ast_parse_caller_presentation(), ast_party_redirecting_free(), ast_party_redirecting_set_init(), ast_redirecting_reason_parse(), ast_skip_blanks(), AST_STANDARD_APP_ARGS, ast_test_flag, ast_trim_blanks(), ast_party_redirecting::count, ast_party_redirecting::from, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_func_args::member, ast_party_id::name, ast_party_id::number, ast_party_func_args::opts, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, party_id_write(), ast_party_name::presentation, ast_party_number::presentation, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, REDIRECTING_OPT_ARG_ARRAY_SIZE, REDIRECTING_OPT_INHIBIT, redirecting_opts, status, ast_party_members::subnames, ast_party_redirecting::to, and update().
{
struct ast_party_redirecting redirecting;
enum ID_FIELD_STATUS status;
char *val;
char *parms;
void (*set_it)(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
struct ast_party_func_args args;
struct ast_party_members member;
struct ast_flags opts;
char *opt_args[REDIRECTING_OPT_ARG_ARRAY_SIZE];
if (!value || !chan) {
return -1;
}
parms = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parms);
if (args.argc == 0) {
/* Must have at least one argument. */
return -1;
}
AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
/* Too few or too many subnames */
return -1;
}
if (ast_app_parse_options(redirecting_opts, &opts, opt_args, args.opts)) {
/* General invalid option syntax. */
return -1;
}
/* Determine if the update indication inhibit option is present */
if (ast_test_flag(&opts, REDIRECTING_OPT_INHIBIT)) {
set_it = ast_channel_set_redirecting;
} else {
set_it = ast_channel_update_redirecting;
}
ast_channel_lock(chan);
ast_party_redirecting_set_init(&redirecting, ast_channel_redirecting(chan));
ast_channel_unlock(chan);
value = ast_skip_blanks(value);
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) {
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("to", member.argv[0])) {
status = party_id_write(&redirecting.to, 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 (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
int pres;
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
pres = atoi(val);
} else {
pres = ast_parse_caller_presentation(val);
}
if (pres < 0) {
ast_log(LOG_ERROR,
"Unknown redirecting combined presentation '%s', value unchanged\n", val);
} else {
redirecting.from.name.presentation = pres;
redirecting.from.number.presentation = pres;
redirecting.to.name.presentation = pres;
redirecting.to.number.presentation = pres;
set_it(chan, &redirecting, NULL);
}
} else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
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 reason '%s', value unchanged\n", val);
} else {
redirecting.reason = reason;
set_it(chan, &redirecting, NULL);
}
} else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
val = ast_strdupa(value);
ast_trim_blanks(val);
if (('0' <= val[0]) && (val[0] <= '9')) {
redirecting.count = atoi(val);
set_it(chan, &redirecting, NULL);
} else {
ast_log(LOG_ERROR, "Unknown redirecting count '%s', value unchanged\n", val);
}
} else if (1 < member.argc && !strcasecmp("priv", member.argv[0])) {
if (!strcasecmp("orig", member.argv[1])) {
status = party_id_write(&redirecting.priv_orig, member.argc - 2, member.argv + 2,
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[1])) {
status = party_id_write(&redirecting.priv_from, member.argc - 2, member.argv + 2,
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("to", member.argv[1])) {
status = party_id_write(&redirecting.priv_to, member.argc - 2, member.argv + 2, 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 {
ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
}
} else {
ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
}
return 0;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 1855 of file func_callerid.c.
References ast_custom_function_unregister().
{
int res;
res = ast_custom_function_unregister(&callerpres_function);
res |= ast_custom_function_unregister(&callerid_function);
res |= ast_custom_function_unregister(&connectedline_function);
res |= ast_custom_function_unregister(&redirecting_function);
return res;
}
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 1885 of file func_callerid.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 1885 of file func_callerid.c.
struct ast_custom_function callerid_function [static] |
Definition at line 1822 of file func_callerid.c.
int callerpres_deprecate_notify [static] |
TRUE if we have already notified about CALLERPRES being deprecated.
Definition at line 886 of file func_callerid.c.
struct ast_custom_function callerpres_function [static] |
Definition at line 1829 of file func_callerid.c.
struct ast_custom_function connectedline_function [static] |
{
.name = "CONNECTEDLINE",
.read = connectedline_read,
.write = connectedline_write,
}
Definition at line 1836 of file func_callerid.c.
struct ast_app_option connectedline_opts[128] = { [ 'i' ] = { .flag = CONNECTED_LINE_OPT_INHIBIT }, } [static] |
Definition at line 431 of file func_callerid.c.
Referenced by connectedline_write().
struct ast_custom_function redirecting_function [static] |
{
.name = "REDIRECTING",
.read = redirecting_read,
.write = redirecting_write,
}
Definition at line 1842 of file func_callerid.c.
struct ast_app_option redirecting_opts[128] = { [ 'i' ] = { .flag = REDIRECTING_OPT_INHIBIT }, } [static] |
Definition at line 445 of file func_callerid.c.
Referenced by redirecting_write().