Thu Sep 7 01:03:29 2017

Asterisk developer's documentation


func_callerid.c File Reference

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.

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

 AST_APP_OPTIONS (redirecting_opts, BEGIN_OPTIONS AST_APP_OPTION('i', REDIRECTING_OPT_INHIBIT), END_OPTIONS)
 AST_APP_OPTIONS (connectedline_opts, BEGIN_OPTIONS AST_APP_OPTION('i', CONNECTED_LINE_OPT_INHIBIT), END_OPTIONS)
 AST_DEFINE_APP_ARGS_TYPE (ast_party_members, AST_APP_ARG(subnames[10]);)
 AST_DEFINE_APP_ARGS_TYPE (ast_party_func_args, AST_APP_ARG(member);AST_APP_ARG(opts);AST_APP_ARG(other);)
 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)")
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_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_custom_function redirecting_function

Detailed Description

Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting).

See Also:

Definition in file func_callerid.c.


Enumeration Type Documentation

Enumerator:
CONNECTED_LINE_OPT_DUMMY 

Delete this if CONNECTED_LINE ever gets an option with parameters.

CONNECTED_LINE_OPT_ARG_ARRAY_SIZE 
Note:
This entry _MUST_ be the last one in the enum

Definition at line 334 of file func_callerid.c.

00334                              {
00335    CONNECTED_LINE_OPT_DUMMY,  /*!< Delete this if CONNECTED_LINE ever gets an option with parameters. */
00336 
00337    /*! \note This entry _MUST_ be the last one in the enum */
00338    CONNECTED_LINE_OPT_ARG_ARRAY_SIZE
00339 };

Enumerator:
CONNECTED_LINE_OPT_INHIBIT 

Definition at line 331 of file func_callerid.c.

00331                               {
00332    CONNECTED_LINE_OPT_INHIBIT = (1 << 0),
00333 };

Enumerator:
ID_FIELD_VALID 
ID_FIELD_INVALID 
ID_FIELD_UNKNOWN 

Definition at line 315 of file func_callerid.c.

00315                      {
00316    ID_FIELD_VALID,
00317    ID_FIELD_INVALID,
00318    ID_FIELD_UNKNOWN
00319 };

Enumerator:
REDIRECTING_OPT_DUMMY 

Delete this if REDIRECTING ever gets an option with parameters.

REDIRECTING_OPT_ARG_ARRAY_SIZE 
Note:
This entry _MUST_ be the last one in the enum

Definition at line 348 of file func_callerid.c.

00348                           {
00349    REDIRECTING_OPT_DUMMY,  /*!< Delete this if REDIRECTING ever gets an option with parameters. */
00350 
00351    /*! \note This entry _MUST_ be the last one in the enum */
00352    REDIRECTING_OPT_ARG_ARRAY_SIZE
00353 };

Enumerator:
REDIRECTING_OPT_INHIBIT 

Definition at line 345 of file func_callerid.c.

00345                            {
00346    REDIRECTING_OPT_INHIBIT = (1 << 0),
00347 };


Function Documentation

AST_APP_OPTIONS ( redirecting_opts  ,
BEGIN_OPTIONS   AST_APP_OPTION'i', REDIRECTING_OPT_INHIBIT,
END_OPTIONS   
)
AST_APP_OPTIONS ( connectedline_opts  ,
BEGIN_OPTIONS   AST_APP_OPTION'i', CONNECTED_LINE_OPT_INHIBIT,
END_OPTIONS   
)
AST_DEFINE_APP_ARGS_TYPE ( ast_party_members  ,
AST_APP_ARG(subnames[10]);   
)
AST_DEFINE_APP_ARGS_TYPE ( ast_party_func_args  ,
AST_APP_ARG(member);AST_APP_ARG(opts);AST_APP_ARG(other);   
)
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)"   
)
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 880 of file func_callerid.c.

References ast_party_caller::ani, ast_party_caller::ani2, args, ARRAY_LEN, AST_APP_ARG, ast_callerid_split(), ast_channel_lock, ast_channel_unlock, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, AST_STANDARD_APP_ARGS, ast_strdupa, ast_channel::caller, ast_channel::dialed, ast_party_redirecting::from, ast_party_caller::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, name, ast_party_dialed::number, ast_party_id::number, party_id_read(), party_subaddress_read(), ast_party_dialed::plan, ast_channel::redirecting, status, ast_party_dialed::str, ast_party_number::str, ast_party_dialed::subaddress, and ast_party_number::valid.

00881 {
00882    enum ID_FIELD_STATUS status;
00883    char *parms;
00884    struct ast_party_members member;
00885    AST_DECLARE_APP_ARGS(args,
00886       AST_APP_ARG(member); /*!< Member name */
00887       AST_APP_ARG(cid);    /*!< Optional caller id to parse instead of from the channel. */
00888       );
00889 
00890    /* Ensure that the buffer is empty */
00891    *buf = 0;
00892 
00893    if (!chan) {
00894       return -1;
00895    }
00896 
00897    parms = ast_strdupa(data);
00898    AST_STANDARD_APP_ARGS(args, parms);
00899    if (args.argc == 0) {
00900       /* Must have at least one argument. */
00901       return -1;
00902    }
00903 
00904    AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
00905    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
00906       /* Too few or too many subnames */
00907       return -1;
00908    }
00909 
00910    if (args.argc == 2) {
00911       char name[80];
00912       char num[80];
00913 
00914       ast_callerid_split(args.cid, name, sizeof(name), num, sizeof(num));
00915 
00916       if (member.argc == 1 && !strcasecmp("all", member.argv[0])) {
00917          snprintf(buf, len, "\"%s\" <%s>", name, num);
00918       } else if (member.argc == 1 && !strcasecmp("name", member.argv[0])) {
00919          ast_copy_string(buf, name, len);
00920       } else if (member.argc == 1 && !strncasecmp("num", member.argv[0], 3)) {
00921          /* Accept num[ber] */
00922          ast_copy_string(buf, num, len);
00923       } else {
00924          ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
00925       }
00926    } else {
00927       ast_channel_lock(chan);
00928 
00929       if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
00930          if (chan->redirecting.from.number.valid
00931             && chan->redirecting.from.number.str) {
00932             ast_copy_string(buf, chan->redirecting.from.number.str, len);
00933          }
00934       } else if (!strcasecmp("dnid", member.argv[0])) {
00935          if (member.argc == 1) {
00936             /* Setup as if user had given dnid-num instead. */
00937             member.argc = 2;
00938             member.argv[1] = "num";
00939          }
00940          if (!strncasecmp("num", member.argv[1], 3)) {
00941             /*
00942              * Accept num[ber]
00943              * dnid-num...
00944              */
00945             if (member.argc == 2) {
00946                /* dnid-num */
00947                if (chan->dialed.number.str) {
00948                   ast_copy_string(buf, chan->dialed.number.str, len);
00949                }
00950             } else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
00951                /* dnid-num-plan */
00952                snprintf(buf, len, "%d", chan->dialed.number.plan);
00953             } else {
00954                ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
00955             }
00956          } else if (!strncasecmp("subaddr", member.argv[1], 7)) {
00957             /*
00958              * Accept subaddr[ess]
00959              * dnid-subaddr...
00960              */
00961             status = party_subaddress_read(buf, len, member.argc - 2, member.argv + 2,
00962                &chan->dialed.subaddress);
00963             switch (status) {
00964             case ID_FIELD_VALID:
00965             case ID_FIELD_INVALID:
00966                break;
00967             default:
00968                ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
00969                break;
00970             }
00971          } else {
00972             ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
00973          }
00974       } else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
00975          snprintf(buf, len, "%d", chan->caller.ani2);
00976       } else if (!strcasecmp("ani", member.argv[0])) {
00977          if (member.argc == 1) {
00978             /* Setup as if user had given ani-num instead. */
00979             member.argc = 2;
00980             member.argv[1] = "num";
00981          }
00982          status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
00983             &chan->caller.ani);
00984          switch (status) {
00985          case ID_FIELD_VALID:
00986          case ID_FIELD_INVALID:
00987             break;
00988          default:
00989             ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
00990             break;
00991          }
00992       } else {
00993          status = party_id_read(buf, len, member.argc, member.argv, &chan->caller.id);
00994          switch (status) {
00995          case ID_FIELD_VALID:
00996          case ID_FIELD_INVALID:
00997             break;
00998          default:
00999             ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01000             break;
01001          }
01002       }
01003 
01004       ast_channel_unlock(chan);
01005    }
01006 
01007    return 0;
01008 }

static int callerid_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 1022 of file func_callerid.c.

References ast_party_caller::ani, ast_party_caller::ani2, ARRAY_LEN, ast_cdr_setcid(), ast_channel_lock, 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_strdupa, ast_trim_blanks(), ast_channel::caller, ast_channel::cdr, ast_channel::dialed, ast_party_redirecting::from, ast_party_caller::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_dialed::number, ast_party_id::number, party_id_write(), party_subaddress_write(), ast_party_dialed::plan, ast_channel::redirecting, status, ast_party_dialed::str, ast_party_number::str, ast_party_dialed::subaddress, and ast_party_number::valid.

01023 {
01024    struct ast_party_caller caller;
01025    struct ast_party_dialed dialed;
01026    enum ID_FIELD_STATUS status;
01027    char *val;
01028    char *parms;
01029    struct ast_party_func_args args;
01030    struct ast_party_members member;
01031 
01032    if (!value || !chan) {
01033       return -1;
01034    }
01035 
01036    parms = ast_strdupa(data);
01037    AST_STANDARD_APP_ARGS(args, parms);
01038    if (args.argc == 0) {
01039       /* Must have at least one argument. */
01040       return -1;
01041    }
01042 
01043    AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
01044    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
01045       /* Too few or too many subnames */
01046       return -1;
01047    }
01048 
01049    value = ast_skip_blanks(value);
01050 
01051    ast_channel_lock(chan);
01052    if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
01053       chan->redirecting.from.number.valid = 1;
01054       ast_free(chan->redirecting.from.number.str);
01055       chan->redirecting.from.number.str = ast_strdup(value);
01056       if (chan->cdr) {
01057          ast_cdr_setcid(chan->cdr, chan);
01058       }
01059    } else if (!strcasecmp("dnid", member.argv[0])) {
01060       ast_party_dialed_set_init(&dialed, &chan->dialed);
01061       if (member.argc == 1) {
01062          /* Setup as if user had given dnid-num instead. */
01063          member.argc = 2;
01064          member.argv[1] = "num";
01065       }
01066       if (!strncasecmp("num", member.argv[1], 3)) {
01067          /*
01068           * Accept num[ber]
01069           * dnid-num...
01070           */
01071          if (member.argc == 2) {
01072             /* dnid-num */
01073             dialed.number.str = ast_strdup(value);
01074             ast_trim_blanks(dialed.number.str);
01075             ast_party_dialed_set(&chan->dialed, &dialed);
01076             if (chan->cdr) {
01077                ast_cdr_setcid(chan->cdr, chan);
01078             }
01079          } else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
01080             /* dnid-num-plan */
01081             val = ast_strdupa(value);
01082             ast_trim_blanks(val);
01083 
01084             if (('0' <= val[0]) && (val[0] <= '9')) {
01085                chan->dialed.number.plan = atoi(val);
01086                if (chan->cdr) {
01087                   ast_cdr_setcid(chan->cdr, chan);
01088                }
01089             } else {
01090                ast_log(LOG_ERROR,
01091                   "Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
01092             }
01093          } else {
01094             ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01095          }
01096       } else if (!strncasecmp("subaddr", member.argv[1], 7)) {
01097          /*
01098           * Accept subaddr[ess]
01099           * dnid-subaddr...
01100           */
01101          status = party_subaddress_write(&dialed.subaddress, member.argc - 2,
01102             member.argv + 2, value);
01103          switch (status) {
01104          case ID_FIELD_VALID:
01105             ast_party_dialed_set(&chan->dialed, &dialed);
01106             if (chan->cdr) {
01107                ast_cdr_setcid(chan->cdr, chan);
01108             }
01109             break;
01110          case ID_FIELD_INVALID:
01111             break;
01112          default:
01113             ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01114             break;
01115          }
01116       } else {
01117          ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01118       }
01119       ast_party_dialed_free(&dialed);
01120    } else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
01121       val = ast_strdupa(value);
01122       ast_trim_blanks(val);
01123 
01124       if (('0' <= val[0]) && (val[0] <= '9')) {
01125          chan->caller.ani2 = atoi(val);
01126          if (chan->cdr) {
01127             ast_cdr_setcid(chan->cdr, chan);
01128          }
01129       } else {
01130          ast_log(LOG_ERROR, "Unknown callerid ani2 '%s', value unchanged\n", val);
01131       }
01132    } else if (!strcasecmp("ani", member.argv[0])) {
01133       ast_party_caller_set_init(&caller, &chan->caller);
01134       if (member.argc == 1) {
01135          /* Setup as if user had given ani-num instead. */
01136          member.argc = 2;
01137          member.argv[1] = "num";
01138       }
01139       status = party_id_write(&caller.ani, member.argc - 1, member.argv + 1, value);
01140       switch (status) {
01141       case ID_FIELD_VALID:
01142          ast_party_caller_set(&chan->caller, &caller, NULL);
01143          if (chan->cdr) {
01144             ast_cdr_setcid(chan->cdr, chan);
01145          }
01146          break;
01147       case ID_FIELD_INVALID:
01148          break;
01149       default:
01150          ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01151          break;
01152       }
01153       ast_party_caller_free(&caller);
01154    } else {
01155       ast_party_caller_set_init(&caller, &chan->caller);
01156       status = party_id_write(&caller.id, member.argc, member.argv, value);
01157       switch (status) {
01158       case ID_FIELD_VALID:
01159          ast_channel_set_caller_event(chan, &caller, NULL);
01160          if (chan->cdr) {
01161             ast_cdr_setcid(chan->cdr, chan);
01162          }
01163          break;
01164       case ID_FIELD_INVALID:
01165          break;
01166       default:
01167          ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
01168          break;
01169       }
01170       ast_party_caller_free(&caller);
01171    }
01172    ast_channel_unlock(chan);
01173 
01174    return 0;
01175 }

static int callerpres_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 813 of file func_callerid.c.

References ast_copy_string(), ast_log(), ast_named_caller_presentation(), ast_party_id_presentation(), ast_channel::caller, ast_party_caller::id, and LOG_WARNING.

00814 {
00815    if (!chan) {
00816       ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
00817       return -1;
00818    }
00819 
00820    if (!callerpres_deprecate_notify) {
00821       callerpres_deprecate_notify = 1;
00822       ast_log(LOG_WARNING, "CALLERPRES is deprecated."
00823          "  Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
00824    }
00825    ast_copy_string(buf,
00826       ast_named_caller_presentation(ast_party_id_presentation(&chan->caller.id)), len);
00827    return 0;
00828 }

static int callerpres_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 842 of file func_callerid.c.

References ast_log(), ast_parse_caller_presentation(), ast_channel::caller, ast_party_caller::id, LOG_WARNING, ast_party_id::name, ast_party_id::number, ast_party_number::presentation, and ast_party_name::presentation.

00843 {
00844    int pres;
00845 
00846    if (!chan) {
00847       ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
00848       return -1;
00849    }
00850 
00851    if (!callerpres_deprecate_notify) {
00852       callerpres_deprecate_notify = 1;
00853       ast_log(LOG_WARNING, "CALLERPRES is deprecated."
00854          "  Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
00855    }
00856 
00857    pres = ast_parse_caller_presentation(value);
00858    if (pres < 0) {
00859       ast_log(LOG_WARNING, "'%s' is not a valid presentation (see 'show function CALLERPRES')\n", value);
00860    } else {
00861       chan->caller.id.name.presentation = pres;
00862       chan->caller.id.number.presentation = pres;
00863    }
00864    return 0;
00865 }

static int connectedline_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 1190 of file func_callerid.c.

References ARRAY_LEN, ast_channel_lock, ast_channel_unlock, ast_connected_line_source_name(), ast_copy_string(), ast_log(), AST_NONSTANDARD_APP_ARGS, ast_strdupa, ast_channel::connected, ast_party_connected_line::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, party_id_read(), ast_party_connected_line::source, and status.

01191 {
01192    struct ast_party_members member;
01193    char *read_what;
01194    enum ID_FIELD_STATUS status;
01195 
01196    /* Ensure that the buffer is empty */
01197    *buf = 0;
01198 
01199    if (!chan) {
01200       return -1;
01201    }
01202 
01203    read_what = ast_strdupa(data);
01204    AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
01205    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
01206       /* Too few or too many subnames */
01207       return -1;
01208    }
01209 
01210    ast_channel_lock(chan);
01211 
01212    if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
01213       ast_copy_string(buf, ast_connected_line_source_name(chan->connected.source), len);
01214    } else {
01215       status = party_id_read(buf, len, member.argc, member.argv, &chan->connected.id);
01216       switch (status) {
01217       case ID_FIELD_VALID:
01218       case ID_FIELD_INVALID:
01219          break;
01220       default:
01221          ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
01222          break;
01223       }
01224    }
01225 
01226    ast_channel_unlock(chan);
01227 
01228    return 0;
01229 }

static int connectedline_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 1243 of file func_callerid.c.

References ARRAY_LEN, ast_app_parse_options(), 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_strdupa, ast_test_flag, ast_trim_blanks(), ast_channel::connected, CONNECTED_LINE_OPT_ARG_ARRAY_SIZE, CONNECTED_LINE_OPT_INHIBIT, ast_party_connected_line::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, party_id_write(), ast_party_connected_line::source, status, and update().

01244 {
01245    struct ast_party_connected_line connected;
01246    enum ID_FIELD_STATUS status;
01247    char *val;
01248    char *parms;
01249    void (*set_it)(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update);
01250    struct ast_party_func_args args;
01251    struct ast_party_members member;
01252    struct ast_flags opts;
01253    char *opt_args[CONNECTED_LINE_OPT_ARG_ARRAY_SIZE];
01254 
01255    if (!value || !chan) {
01256       return -1;
01257    }
01258 
01259    parms = ast_strdupa(data);
01260    AST_STANDARD_APP_ARGS(args, parms);
01261    if (args.argc == 0) {
01262       /* Must have at least one argument. */
01263       return -1;
01264    }
01265 
01266    AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
01267    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
01268       /* Too few or too many subnames */
01269       return -1;
01270    }
01271 
01272    if (ast_app_parse_options(connectedline_opts, &opts, opt_args, args.opts)) {
01273       /* General invalid option syntax. */
01274       return -1;
01275    }
01276 
01277    /* Determine if the update indication inhibit option is present */
01278    if (ast_test_flag(&opts, CONNECTED_LINE_OPT_INHIBIT)) {
01279       set_it = ast_channel_set_connected_line;
01280    } else {
01281       set_it = ast_channel_update_connected_line;
01282    }
01283 
01284    ast_channel_lock(chan);
01285    ast_party_connected_line_set_init(&connected, &chan->connected);
01286    ast_channel_unlock(chan);
01287 
01288    value = ast_skip_blanks(value);
01289 
01290    if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
01291       int source;
01292 
01293       val = ast_strdupa(value);
01294       ast_trim_blanks(val);
01295 
01296       if (('0' <= val[0]) && (val[0] <= '9')) {
01297          source = atoi(val);
01298       } else {
01299          source = ast_connected_line_source_parse(val);
01300       }
01301 
01302       if (source < 0) {
01303          ast_log(LOG_ERROR, "Unknown connectedline source '%s', value unchanged\n", val);
01304       } else {
01305          connected.source = source;
01306          set_it(chan, &connected, NULL);
01307       }
01308    } else {
01309       status = party_id_write(&connected.id, member.argc, member.argv, value);
01310       switch (status) {
01311       case ID_FIELD_VALID:
01312          set_it(chan, &connected, NULL);
01313          break;
01314       case ID_FIELD_INVALID:
01315          break;
01316       default:
01317          ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
01318          break;
01319       }
01320       ast_party_connected_line_free(&connected);
01321    }
01322 
01323    return 0;
01324 }

static int load_module ( void   )  [static]
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 489 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_number::str, ast_party_name::str, ast_party_id::subaddress, ast_party_id::tag, ast_party_number::valid, and ast_party_name::valid.

Referenced by callerid_read(), connectedline_read(), and redirecting_read().

00490 {
00491    enum ID_FIELD_STATUS status;
00492 
00493    if (argc == 0) {
00494       /* Must have at least one subname. */
00495       return ID_FIELD_UNKNOWN;
00496    }
00497 
00498    status = ID_FIELD_VALID;
00499 
00500    if (argc == 1 && !strcasecmp("all", argv[0])) {
00501       snprintf(buf, len, "\"%s\" <%s>",
00502           S_COR(id->name.valid, id->name.str, ""),
00503           S_COR(id->number.valid, id->number.str, ""));
00504    } else if (!strcasecmp("name", argv[0])) {
00505       status = party_name_read(buf, len, argc - 1, argv + 1, &id->name);
00506    } else if (!strncasecmp("num", argv[0], 3)) {
00507       /* Accept num[ber] */
00508       status = party_number_read(buf, len, argc - 1, argv + 1, &id->number);
00509    } else if (!strncasecmp("subaddr", argv[0], 7)) {
00510       /* Accept subaddr[ess] */
00511       status = party_subaddress_read(buf, len, argc - 1, argv + 1, &id->subaddress);
00512    } else if (argc == 1 && !strcasecmp("tag", argv[0])) {
00513       if (id->tag) {
00514          ast_copy_string(buf, id->tag, len);
00515       }
00516    } else if (argc == 1 && !strcasecmp("ton", argv[0])) {
00517       /* ton is an alias for num-plan */
00518       snprintf(buf, len, "%d", id->number.plan);
00519    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00520       /*
00521        * Accept pres[entation]
00522        * This is the combined name/number presentation.
00523        */
00524       ast_copy_string(buf,
00525          ast_named_caller_presentation(ast_party_id_presentation(id)), len);
00526    } else {
00527       status = ID_FIELD_UNKNOWN;
00528    }
00529 
00530    return status;
00531 }

static enum ID_FIELD_STATUS party_id_write ( struct ast_party_id id,
int  argc,
char *  argv[],
const char *  value 
) [static]

Definition at line 724 of file func_callerid.c.

References ast_callerid_split(), ast_log(), ast_parse_caller_presentation(), ast_strdup, ast_strdupa, ast_trim_blanks(), ID_FIELD_INVALID, ID_FIELD_UNKNOWN, ID_FIELD_VALID, LOG_ERROR, ast_party_id::name, name, ast_party_id::number, party_name_write(), party_number_write(), party_subaddress_write(), status, ast_party_number::str, ast_party_name::str, ast_party_id::subaddress, and ast_party_id::tag.

Referenced by callerid_write(), connectedline_write(), and redirecting_write().

00725 {
00726    char *val;
00727    enum ID_FIELD_STATUS status;
00728 
00729    if (argc == 0) {
00730       /* Must have at least one subname. */
00731       return ID_FIELD_UNKNOWN;
00732    }
00733 
00734    status = ID_FIELD_VALID;
00735 
00736    if (argc == 1 && !strcasecmp("all", argv[0])) {
00737       char name[256];
00738       char num[256];
00739 
00740       ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
00741       id->name.valid = 1;
00742       id->name.str = ast_strdup(name);
00743       if (!id->name.str) {
00744          return ID_FIELD_INVALID;
00745       }
00746       id->number.valid = 1;
00747       id->number.str = ast_strdup(num);
00748       if (!id->number.str) {
00749          return ID_FIELD_INVALID;
00750       }
00751    } else if (!strcasecmp("name", argv[0])) {
00752       status = party_name_write(&id->name, argc - 1, argv + 1, value);
00753    } else if (!strncasecmp("num", argv[0], 3)) {
00754       /* Accept num[ber] */
00755       status = party_number_write(&id->number, argc - 1, argv + 1, value);
00756    } else if (!strncasecmp("subaddr", argv[0], 7)) {
00757       /* Accept subaddr[ess] */
00758       status = party_subaddress_write(&id->subaddress, argc - 1, argv + 1, value);
00759    } else if (argc == 1 && !strcasecmp("tag", argv[0])) {
00760       id->tag = ast_strdup(value);
00761       ast_trim_blanks(id->tag);
00762    } else if (argc == 1 && !strcasecmp("ton", argv[0])) {
00763       /* ton is an alias for num-plan */
00764       argv[0] = "plan";
00765       status = party_number_write(&id->number, argc, argv, value);
00766    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00767       int pres;
00768 
00769       /*
00770        * Accept pres[entation]
00771        * This is the combined name/number presentation.
00772        */
00773       val = ast_strdupa(value);
00774       ast_trim_blanks(val);
00775 
00776       if (('0' <= val[0]) && (val[0] <= '9')) {
00777          pres = atoi(val);
00778       } else {
00779          pres = ast_parse_caller_presentation(val);
00780       }
00781 
00782       if (pres < 0) {
00783          ast_log(LOG_ERROR,
00784             "Unknown combined presentation '%s', value unchanged\n", val);
00785          status = ID_FIELD_INVALID;
00786       } else {
00787          id->name.presentation = pres;
00788          id->number.presentation = pres;
00789       }
00790    } else {
00791       status = ID_FIELD_UNKNOWN;
00792    }
00793 
00794    return status;
00795 }

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 373 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().

00374 {
00375    enum ID_FIELD_STATUS status;
00376 
00377    status = ID_FIELD_VALID;
00378 
00379    if (argc == 0) {
00380       /* We want the name string */
00381       if (name->valid && name->str) {
00382          ast_copy_string(buf, name->str, len);
00383       }
00384    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00385       snprintf(buf, len, "%d", name->valid);
00386    } else if (argc == 1 && !strcasecmp("charset", argv[0])) {
00387       ast_copy_string(buf, ast_party_name_charset_str(name->char_set), len);
00388    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00389       /* Accept pres[entation] */
00390       ast_copy_string(buf, ast_named_caller_presentation(name->presentation), len);
00391    } else {
00392       status = ID_FIELD_UNKNOWN;
00393    }
00394 
00395    return status;
00396 }

static enum ID_FIELD_STATUS party_name_write ( struct ast_party_name name,
int  argc,
char *  argv[],
const char *  value 
) [static]

Definition at line 547 of file func_callerid.c.

References ast_log(), ast_parse_caller_presentation(), ast_party_name_charset_parse(), ast_strdup, ast_strdupa, 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().

00548 {
00549    char *val;
00550    enum ID_FIELD_STATUS status;
00551 
00552    status = ID_FIELD_VALID;
00553 
00554    if (argc == 0) {
00555       /* We are setting the name string */
00556       name->valid = 1;
00557       name->str = ast_strdup(value);
00558       ast_trim_blanks(name->str);
00559    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00560       name->valid = atoi(value) ? 1 : 0;
00561    } else if (argc == 1 && !strcasecmp("charset", argv[0])) {
00562       int char_set;
00563 
00564       val = ast_strdupa(value);
00565       ast_trim_blanks(val);
00566 
00567       if (('0' <= val[0]) && (val[0] <= '9')) {
00568          char_set = atoi(val);
00569       } else {
00570          char_set = ast_party_name_charset_parse(val);
00571       }
00572 
00573       if (char_set < 0) {
00574          ast_log(LOG_ERROR,
00575             "Unknown name char-set '%s', value unchanged\n", val);
00576          status = ID_FIELD_INVALID;
00577       } else {
00578          name->char_set = char_set;
00579       }
00580    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00581       int pres;
00582 
00583       /* Accept pres[entation] */
00584       val = ast_strdupa(value);
00585       ast_trim_blanks(val);
00586 
00587       if (('0' <= val[0]) && (val[0] <= '9')) {
00588          pres = atoi(val);
00589       } else {
00590          pres = ast_parse_caller_presentation(val);
00591       }
00592 
00593       if (pres < 0) {
00594          ast_log(LOG_ERROR,
00595             "Unknown name presentation '%s', value unchanged\n", val);
00596          status = ID_FIELD_INVALID;
00597       } else {
00598          name->presentation = pres;
00599       }
00600    } else {
00601       status = ID_FIELD_UNKNOWN;
00602    }
00603 
00604    return status;
00605 }

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 412 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().

00413 {
00414    enum ID_FIELD_STATUS status;
00415 
00416    status = ID_FIELD_VALID;
00417 
00418    if (argc == 0) {
00419       /* We want the number string */
00420       if (number->valid && number->str) {
00421          ast_copy_string(buf, number->str, len);
00422       }
00423    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00424       snprintf(buf, len, "%d", number->valid);
00425    } else if (argc == 1 && !strcasecmp("plan", argv[0])) {
00426       snprintf(buf, len, "%d", number->plan);
00427    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00428       /* Accept pres[entation] */
00429       ast_copy_string(buf, ast_named_caller_presentation(number->presentation), len);
00430    } else {
00431       status = ID_FIELD_UNKNOWN;
00432    }
00433 
00434    return status;
00435 }

static enum ID_FIELD_STATUS party_number_write ( struct ast_party_number number,
int  argc,
char *  argv[],
const char *  value 
) [static]

Definition at line 621 of file func_callerid.c.

References ast_log(), ast_parse_caller_presentation(), ast_strdup, ast_strdupa, 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().

00622 {
00623    char *val;
00624    enum ID_FIELD_STATUS status;
00625 
00626    status = ID_FIELD_VALID;
00627 
00628    if (argc == 0) {
00629       /* We are setting the number string */
00630       number->valid = 1;
00631       number->str = ast_strdup(value);
00632       ast_trim_blanks(number->str);
00633    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00634       number->valid = atoi(value) ? 1 : 0;
00635    } else if (argc == 1 && !strcasecmp("plan", argv[0])) {
00636       val = ast_strdupa(value);
00637       ast_trim_blanks(val);
00638 
00639       if (('0' <= val[0]) && (val[0] <= '9')) {
00640          number->plan = atoi(val);
00641       } else {
00642          ast_log(LOG_ERROR,
00643             "Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
00644          status = ID_FIELD_INVALID;
00645       }
00646    } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
00647       int pres;
00648 
00649       /* Accept pres[entation] */
00650       val = ast_strdupa(value);
00651       ast_trim_blanks(val);
00652 
00653       if (('0' <= val[0]) && (val[0] <= '9')) {
00654          pres = atoi(val);
00655       } else {
00656          pres = ast_parse_caller_presentation(val);
00657       }
00658 
00659       if (pres < 0) {
00660          ast_log(LOG_ERROR,
00661             "Unknown number presentation '%s', value unchanged\n", val);
00662          status = ID_FIELD_INVALID;
00663       } else {
00664          number->presentation = pres;
00665       }
00666    } else {
00667       status = ID_FIELD_UNKNOWN;
00668    }
00669 
00670    return status;
00671 }

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 451 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().

00452 {
00453    enum ID_FIELD_STATUS status;
00454 
00455    status = ID_FIELD_VALID;
00456 
00457    if (argc == 0) {
00458       /* We want the subaddress string */
00459       if (subaddress->str) {
00460          ast_copy_string(buf, subaddress->str, len);
00461       }
00462    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00463       snprintf(buf, len, "%d", subaddress->valid);
00464    } else if (argc == 1 && !strcasecmp("type", argv[0])) {
00465       snprintf(buf, len, "%d", subaddress->type);
00466    } else if (argc == 1 && !strcasecmp("odd", argv[0])) {
00467       snprintf(buf, len, "%d", subaddress->odd_even_indicator);
00468    } else {
00469       status = ID_FIELD_UNKNOWN;
00470    }
00471 
00472    return status;
00473 }

static enum ID_FIELD_STATUS party_subaddress_write ( struct ast_party_subaddress subaddress,
int  argc,
char *  argv[],
const char *  value 
) [static]

Definition at line 687 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().

00688 {
00689    enum ID_FIELD_STATUS status;
00690 
00691    status = ID_FIELD_VALID;
00692 
00693    if (argc == 0) {
00694       /* We are setting the subaddress string */
00695       subaddress->str = ast_strdup(value);
00696       ast_trim_blanks(subaddress->str);
00697    } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
00698       subaddress->valid = atoi(value) ? 1 : 0;
00699    } else if (argc == 1 && !strcasecmp("type", argv[0])) {
00700       subaddress->type = atoi(value) ? 2 : 0;
00701    } else if (argc == 1 && !strcasecmp("odd", argv[0])) {
00702       subaddress->odd_even_indicator = atoi(value) ? 1 : 0;
00703    } else {
00704       status = ID_FIELD_UNKNOWN;
00705    }
00706 
00707    return status;
00708 }

static int redirecting_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 1339 of file func_callerid.c.

References ARRAY_LEN, ast_channel_lock, 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_strdupa, ast_party_redirecting::count, ast_party_redirecting::from, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, party_id_read(), ast_party_redirecting::reason, ast_channel::redirecting, status, and ast_party_redirecting::to.

01340 {
01341    struct ast_party_members member;
01342    char *read_what;
01343    enum ID_FIELD_STATUS status;
01344 
01345    /* Ensure that the buffer is empty */
01346    *buf = 0;
01347 
01348    if (!chan) {
01349       return -1;
01350    }
01351 
01352    read_what = ast_strdupa(data);
01353    AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
01354    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
01355       /* Too few or too many subnames */
01356       return -1;
01357    }
01358 
01359    ast_channel_lock(chan);
01360 
01361    if (!strcasecmp("from", member.argv[0])) {
01362       status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
01363          &chan->redirecting.from);
01364       switch (status) {
01365       case ID_FIELD_VALID:
01366       case ID_FIELD_INVALID:
01367          break;
01368       default:
01369          ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01370          break;
01371       }
01372    } else if (!strcasecmp("to", member.argv[0])) {
01373       status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
01374          &chan->redirecting.to);
01375       switch (status) {
01376       case ID_FIELD_VALID:
01377       case ID_FIELD_INVALID:
01378          break;
01379       default:
01380          ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01381          break;
01382       }
01383    } else if (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
01384       /*
01385        * Accept pres[entation]
01386        * This is the combined from name/number presentation.
01387        */
01388       ast_copy_string(buf,
01389          ast_named_caller_presentation(
01390             ast_party_id_presentation(&chan->redirecting.from)), len);
01391    } else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
01392       ast_copy_string(buf, ast_redirecting_reason_name(chan->redirecting.reason), len);
01393    } else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
01394       snprintf(buf, len, "%d", chan->redirecting.count);
01395    } else {
01396       ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01397    }
01398 
01399    ast_channel_unlock(chan);
01400 
01401    return 0;
01402 }

static int redirecting_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 1416 of file func_callerid.c.

References ARRAY_LEN, ast_app_parse_options(), ast_channel_lock, 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_strdupa, ast_test_flag, ast_trim_blanks(), ast_party_redirecting::count, ast_party_redirecting::from, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_id::name, ast_party_id::number, party_id_write(), ast_party_number::presentation, ast_party_name::presentation, ast_party_redirecting::reason, ast_channel::redirecting, REDIRECTING_OPT_ARG_ARRAY_SIZE, REDIRECTING_OPT_INHIBIT, status, ast_party_redirecting::to, and update().

01417 {
01418    struct ast_party_redirecting redirecting;
01419    enum ID_FIELD_STATUS status;
01420    char *val;
01421    char *parms;
01422    void (*set_it)(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
01423    struct ast_party_func_args args;
01424    struct ast_party_members member;
01425    struct ast_flags opts;
01426    char *opt_args[REDIRECTING_OPT_ARG_ARRAY_SIZE];
01427 
01428    if (!value || !chan) {
01429       return -1;
01430    }
01431 
01432    parms = ast_strdupa(data);
01433    AST_STANDARD_APP_ARGS(args, parms);
01434    if (args.argc == 0) {
01435       /* Must have at least one argument. */
01436       return -1;
01437    }
01438 
01439    AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
01440    if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
01441       /* Too few or too many subnames */
01442       return -1;
01443    }
01444 
01445    if (ast_app_parse_options(redirecting_opts, &opts, opt_args, args.opts)) {
01446       /* General invalid option syntax. */
01447       return -1;
01448    }
01449 
01450    /* Determine if the update indication inhibit option is present */
01451    if (ast_test_flag(&opts, REDIRECTING_OPT_INHIBIT)) {
01452       set_it = ast_channel_set_redirecting;
01453    } else {
01454       set_it = ast_channel_update_redirecting;
01455    }
01456 
01457    ast_channel_lock(chan);
01458    ast_party_redirecting_set_init(&redirecting, &chan->redirecting);
01459    ast_channel_unlock(chan);
01460 
01461    value = ast_skip_blanks(value);
01462 
01463    if (!strcasecmp("from", member.argv[0])) {
01464       status = party_id_write(&redirecting.from, member.argc - 1, member.argv + 1,
01465          value);
01466       switch (status) {
01467       case ID_FIELD_VALID:
01468          set_it(chan, &redirecting, NULL);
01469          break;
01470       case ID_FIELD_INVALID:
01471          break;
01472       default:
01473          ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01474          break;
01475       }
01476       ast_party_redirecting_free(&redirecting);
01477    } else if (!strcasecmp("to", member.argv[0])) {
01478       status = party_id_write(&redirecting.to, member.argc - 1, member.argv + 1, value);
01479       switch (status) {
01480       case ID_FIELD_VALID:
01481          set_it(chan, &redirecting, NULL);
01482          break;
01483       case ID_FIELD_INVALID:
01484          break;
01485       default:
01486          ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01487          break;
01488       }
01489       ast_party_redirecting_free(&redirecting);
01490    } else if (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
01491       int pres;
01492 
01493       val = ast_strdupa(value);
01494       ast_trim_blanks(val);
01495 
01496       if (('0' <= val[0]) && (val[0] <= '9')) {
01497          pres = atoi(val);
01498       } else {
01499          pres = ast_parse_caller_presentation(val);
01500       }
01501 
01502       if (pres < 0) {
01503          ast_log(LOG_ERROR,
01504             "Unknown redirecting combined presentation '%s', value unchanged\n", val);
01505       } else {
01506          redirecting.from.name.presentation = pres;
01507          redirecting.from.number.presentation = pres;
01508          redirecting.to.name.presentation = pres;
01509          redirecting.to.number.presentation = pres;
01510          set_it(chan, &redirecting, NULL);
01511       }
01512    } else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
01513       int reason;
01514 
01515       val = ast_strdupa(value);
01516       ast_trim_blanks(val);
01517 
01518       if (('0' <= val[0]) && (val[0] <= '9')) {
01519          reason = atoi(val);
01520       } else {
01521          reason = ast_redirecting_reason_parse(val);
01522       }
01523 
01524       if (reason < 0) {
01525          ast_log(LOG_ERROR, "Unknown redirecting reason '%s', value unchanged\n", val);
01526       } else {
01527          redirecting.reason = reason;
01528          set_it(chan, &redirecting, NULL);
01529       }
01530    } else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
01531       val = ast_strdupa(value);
01532       ast_trim_blanks(val);
01533 
01534       if (('0' <= val[0]) && (val[0] <= '9')) {
01535          redirecting.count = atoi(val);
01536          set_it(chan, &redirecting, NULL);
01537       } else {
01538          ast_log(LOG_ERROR, "Unknown redirecting count '%s', value unchanged\n", val);
01539       }
01540    } else {
01541       ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
01542    }
01543 
01544    return 0;
01545 }

static int unload_module ( void   )  [static]

Definition at line 1580 of file func_callerid.c.

References ast_custom_function_unregister().


Variable Documentation

Definition at line 1547 of file func_callerid.c.

TRUE if we have already notified about CALLERPRES being deprecated.

Definition at line 798 of file func_callerid.c.

Definition at line 1554 of file func_callerid.c.

Initial value:
 {
   .name = "CONNECTEDLINE",
   .read = connectedline_read,
   .write = connectedline_write,
}

Definition at line 1561 of file func_callerid.c.

Initial value:
 {
   .name = "REDIRECTING",
   .read = redirecting_read,
   .write = redirecting_write,
}

Definition at line 1567 of file func_callerid.c.


Generated on 7 Sep 2017 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1