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 |
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 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 };
Definition at line 331 of file func_callerid.c.
00331 { 00332 CONNECTED_LINE_OPT_INHIBIT = (1 << 0), 00333 };
enum ID_FIELD_STATUS |
Definition at line 315 of file func_callerid.c.
00315 { 00316 ID_FIELD_VALID, 00317 ID_FIELD_INVALID, 00318 ID_FIELD_UNKNOWN 00319 };
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 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 };
Definition at line 345 of file func_callerid.c.
00345 { 00346 REDIRECTING_OPT_INHIBIT = (1 << 0), 00347 };
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] |
Definition at line 1598 of file func_callerid.c.
References ast_custom_function_register, AST_MODULE_LOAD_DECLINE, and AST_MODULE_LOAD_SUCCESS.
01599 { 01600 int res; 01601 01602 res = ast_custom_function_register(&callerpres_function); 01603 res |= ast_custom_function_register(&callerid_function); 01604 res |= ast_custom_function_register(&connectedline_function); 01605 res |= ast_custom_function_register(&redirecting_function); 01606 return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; 01607 }
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().
01581 { 01582 int res; 01583 01584 res = ast_custom_function_unregister(&callerpres_function); 01585 res |= ast_custom_function_unregister(&callerid_function); 01586 res |= ast_custom_function_unregister(&connectedline_function); 01587 res |= ast_custom_function_unregister(&redirecting_function); 01588 return res; 01589 }
struct ast_custom_function callerid_function [static] |
Definition at line 1547 of file func_callerid.c.
int callerpres_deprecate_notify [static] |
TRUE if we have already notified about CALLERPRES being deprecated.
Definition at line 798 of file func_callerid.c.
struct ast_custom_function callerpres_function [static] |
Definition at line 1554 of file func_callerid.c.
struct ast_custom_function connectedline_function [static] |
{ .name = "CONNECTEDLINE", .read = connectedline_read, .write = connectedline_write, }
Definition at line 1561 of file func_callerid.c.
struct ast_custom_function redirecting_function [static] |
{ .name = "REDIRECTING", .read = redirecting_read, .write = redirecting_write, }
Definition at line 1567 of file func_callerid.c.