Mon Mar 12 2012 21:39:49

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"
Include dependency graph for func_callerid.c:

Go to the source code of this file.

Data Structures

struct  ast_party_func_args
struct  ast_party_members

Enumerations

enum  CONNECTED_LINE_OPT_ARGS { CONNECTED_LINE_OPT_DUMMY, CONNECTED_LINE_OPT_ARG_ARRAY_SIZE }
enum  CONNECTED_LINE_OPT_FLAGS { CONNECTED_LINE_OPT_INHIBIT = (1 << 0) }
enum  ID_FIELD_STATUS { ID_FIELD_VALID, ID_FIELD_INVALID, ID_FIELD_UNKNOWN }
enum  REDIRECTING_OPT_ARGS { REDIRECTING_OPT_DUMMY, REDIRECTING_OPT_ARG_ARRAY_SIZE }
enum  REDIRECTING_OPT_FLAGS { REDIRECTING_OPT_INHIBIT = (1 << 0) }

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int callerid_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int callerid_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int callerpres_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int callerpres_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int connectedline_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int connectedline_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int load_module (void)
static enum ID_FIELD_STATUS party_id_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_id *id)
static enum ID_FIELD_STATUS party_id_write (struct ast_party_id *id, int argc, char *argv[], const char *value)
static enum ID_FIELD_STATUS party_name_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_name *name)
static enum ID_FIELD_STATUS party_name_write (struct ast_party_name *name, int argc, char *argv[], const char *value)
static enum ID_FIELD_STATUS party_number_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_number *number)
static enum ID_FIELD_STATUS party_number_write (struct ast_party_number *number, int argc, char *argv[], const char *value)
static enum ID_FIELD_STATUS party_subaddress_read (char *buf, size_t len, int argc, char *argv[], const struct ast_party_subaddress *subaddress)
static enum ID_FIELD_STATUS party_subaddress_write (struct ast_party_subaddress *subaddress, int argc, char *argv[], const char *value)
static int redirecting_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int redirecting_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_custom_function callerid_function
static int callerpres_deprecate_notify
static struct ast_custom_function callerpres_function
static struct ast_custom_function connectedline_function
static struct ast_app_option connectedline_opts [128] = { [ 'i' ] = { .flag = CONNECTED_LINE_OPT_INHIBIT }, }
static struct ast_custom_function redirecting_function
static struct ast_app_option redirecting_opts [128] = { [ 'i' ] = { .flag = REDIRECTING_OPT_INHIBIT }, }

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.

                             {
   CONNECTED_LINE_OPT_DUMMY,  /*!< Delete this if CONNECTED_LINE ever gets an option with parameters. */

   /*! \note This entry _MUST_ be the last one in the enum */
   CONNECTED_LINE_OPT_ARG_ARRAY_SIZE
};
Enumerator:
CONNECTED_LINE_OPT_INHIBIT 

Definition at line 331 of file func_callerid.c.

                              {
   CONNECTED_LINE_OPT_INHIBIT = (1 << 0),
};
Enumerator:
ID_FIELD_VALID 
ID_FIELD_INVALID 
ID_FIELD_UNKNOWN 

Definition at line 315 of file func_callerid.c.

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.

                          {
   REDIRECTING_OPT_DUMMY,  /*!< Delete this if REDIRECTING ever gets an option with parameters. */

   /*! \note This entry _MUST_ be the last one in the enum */
   REDIRECTING_OPT_ARG_ARRAY_SIZE
};
Enumerator:
REDIRECTING_OPT_INHIBIT 

Definition at line 345 of file func_callerid.c.

                           {
   REDIRECTING_OPT_INHIBIT = (1 << 0),
};

Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 1600 of file func_callerid.c.

static void __unreg_module ( void  ) [static]

Definition at line 1600 of file func_callerid.c.

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

< Member name

< Optional caller id to parse instead of from the channel.

Definition at line 870 of file func_callerid.c.

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_members::argc, args, ast_party_members::argv, 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_id::number, ast_party_dialed::number, party_id_read(), party_subaddress_read(), ast_party_dialed::plan, ast_channel::redirecting, status, ast_party_number::str, ast_party_dialed::str, ast_party_dialed::subaddress, ast_party_members::subnames, and ast_party_number::valid.

{
   enum ID_FIELD_STATUS status;
   char *parms;
   struct ast_party_members member;
   AST_DECLARE_APP_ARGS(args,
      AST_APP_ARG(member); /*!< Member name */
      AST_APP_ARG(cid);    /*!< Optional caller id to parse instead of from the channel. */
      );

   /* Ensure that the buffer is empty */
   *buf = 0;

   if (!chan) {
      return -1;
   }

   parms = ast_strdupa(data);
   AST_STANDARD_APP_ARGS(args, parms);
   if (args.argc == 0) {
      /* Must have at least one argument. */
      return -1;
   }

   AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   if (args.argc == 2) {
      char name[80];
      char num[80];

      ast_callerid_split(args.cid, name, sizeof(name), num, sizeof(num));

      if (member.argc == 1 && !strcasecmp("all", member.argv[0])) {
         snprintf(buf, len, "\"%s\" <%s>", name, num);
      } else if (member.argc == 1 && !strcasecmp("name", member.argv[0])) {
         ast_copy_string(buf, name, len);
      } else if (member.argc == 1 && !strncasecmp("num", member.argv[0], 3)) {
         /* Accept num[ber] */
         ast_copy_string(buf, num, len);
      } else {
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
      }
   } else {
      ast_channel_lock(chan);

      if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
         if (chan->redirecting.from.number.valid
            && chan->redirecting.from.number.str) {
            ast_copy_string(buf, chan->redirecting.from.number.str, len);
         }
      } else if (!strcasecmp("dnid", member.argv[0])) {
         if (member.argc == 1) {
            /* Setup as if user had given dnid-num instead. */
            member.argc = 2;
            member.argv[1] = "num";
         }
         if (!strncasecmp("num", member.argv[1], 3)) {
            /*
             * Accept num[ber]
             * dnid-num...
             */
            if (member.argc == 2) {
               /* dnid-num */
               if (chan->dialed.number.str) {
                  ast_copy_string(buf, chan->dialed.number.str, len);
               }
            } else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
               /* dnid-num-plan */
               snprintf(buf, len, "%d", chan->dialed.number.plan);
            } else {
               ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
            }
         } else if (!strncasecmp("subaddr", member.argv[1], 7)) {
            /*
             * Accept subaddr[ess]
             * dnid-subaddr...
             */
            status = party_subaddress_read(buf, len, member.argc - 2, member.argv + 2,
               &chan->dialed.subaddress);
            switch (status) {
            case ID_FIELD_VALID:
            case ID_FIELD_INVALID:
               break;
            default:
               ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
               break;
            }
         } else {
            ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
         }
      } else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
         snprintf(buf, len, "%d", chan->caller.ani2);
      } else if (!strcasecmp("ani", member.argv[0])) {
         if (member.argc == 1) {
            /* Setup as if user had given ani-num instead. */
            member.argc = 2;
            member.argv[1] = "num";
         }
         status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
            &chan->caller.ani);
         switch (status) {
         case ID_FIELD_VALID:
         case ID_FIELD_INVALID:
            break;
         default:
            ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
            break;
         }
      } else {
         status = party_id_read(buf, len, member.argc, member.argv, &chan->caller.id);
         switch (status) {
         case ID_FIELD_VALID:
         case ID_FIELD_INVALID:
            break;
         default:
            ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
            break;
         }
      }

      ast_channel_unlock(chan);
   }

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

Definition at line 1012 of file func_callerid.c.

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_cdr_setcid(), ast_channel_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_func_args::member, ast_party_id::number, ast_party_dialed::number, party_id_write(), party_subaddress_write(), ast_party_dialed::plan, ast_channel::redirecting, status, ast_party_number::str, ast_party_dialed::str, ast_party_dialed::subaddress, ast_party_members::subnames, and ast_party_number::valid.

{
   struct ast_party_caller caller;
   struct ast_party_dialed dialed;
   enum ID_FIELD_STATUS status;
   char *val;
   char *parms;
   struct ast_party_func_args args;
   struct ast_party_members member;

   if (!value || !chan) {
      return -1;
   }

   parms = ast_strdupa(data);
   AST_STANDARD_APP_ARGS(args, parms);
   if (args.argc == 0) {
      /* Must have at least one argument. */
      return -1;
   }

   AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   value = ast_skip_blanks(value);

   ast_channel_lock(chan);
   if (member.argc == 1 && !strcasecmp("rdnis", member.argv[0])) {
      chan->redirecting.from.number.valid = 1;
      ast_free(chan->redirecting.from.number.str);
      chan->redirecting.from.number.str = ast_strdup(value);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
   } else if (!strcasecmp("dnid", member.argv[0])) {
      ast_party_dialed_set_init(&dialed, &chan->dialed);
      if (member.argc == 1) {
         /* Setup as if user had given dnid-num instead. */
         member.argc = 2;
         member.argv[1] = "num";
      }
      if (!strncasecmp("num", member.argv[1], 3)) {
         /*
          * Accept num[ber]
          * dnid-num...
          */
         if (member.argc == 2) {
            /* dnid-num */
            dialed.number.str = ast_strdup(value);
            ast_trim_blanks(dialed.number.str);
            ast_party_dialed_set(&chan->dialed, &dialed);
            if (chan->cdr) {
               ast_cdr_setcid(chan->cdr, chan);
            }
         } else if (member.argc == 3 && !strcasecmp("plan", member.argv[2])) {
            /* dnid-num-plan */
            val = ast_strdupa(value);
            ast_trim_blanks(val);

            if (('0' <= val[0]) && (val[0] <= '9')) {
               chan->dialed.number.plan = atoi(val);
               if (chan->cdr) {
                  ast_cdr_setcid(chan->cdr, chan);
               }
            } else {
               ast_log(LOG_ERROR,
                  "Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
            }
         } else {
            ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
         }
      } else if (!strncasecmp("subaddr", member.argv[1], 7)) {
         /*
          * Accept subaddr[ess]
          * dnid-subaddr...
          */
         status = party_subaddress_write(&dialed.subaddress, member.argc - 2,
            member.argv + 2, value);
         switch (status) {
         case ID_FIELD_VALID:
            ast_party_dialed_set(&chan->dialed, &dialed);
            if (chan->cdr) {
               ast_cdr_setcid(chan->cdr, chan);
            }
            break;
         case ID_FIELD_INVALID:
            break;
         default:
            ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
            break;
         }
      } else {
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
      }
      ast_party_dialed_free(&dialed);
   } else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         chan->caller.ani2 = atoi(val);
         if (chan->cdr) {
            ast_cdr_setcid(chan->cdr, chan);
         }
      } else {
         ast_log(LOG_ERROR, "Unknown callerid ani2 '%s', value unchanged\n", val);
      }
   } else if (!strcasecmp("ani", member.argv[0])) {
      ast_party_caller_set_init(&caller, &chan->caller);
      if (member.argc == 1) {
         /* Setup as if user had given ani-num instead. */
         member.argc = 2;
         member.argv[1] = "num";
      }
      status = party_id_write(&caller.ani, member.argc - 1, member.argv + 1, value);
      switch (status) {
      case ID_FIELD_VALID:
         ast_party_caller_set(&chan->caller, &caller, NULL);
         if (chan->cdr) {
            ast_cdr_setcid(chan->cdr, chan);
         }
         break;
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
         break;
      }
      ast_party_caller_free(&caller);
   } else {
      ast_party_caller_set_init(&caller, &chan->caller);
      status = party_id_write(&caller.id, member.argc, member.argv, value);
      switch (status) {
      case ID_FIELD_VALID:
         ast_channel_set_caller_event(chan, &caller, NULL);
         if (chan->cdr) {
            ast_cdr_setcid(chan->cdr, chan);
         }
         break;
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
         break;
      }
      ast_party_caller_free(&caller);
   }
   ast_channel_unlock(chan);

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

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

{
   if (!callerpres_deprecate_notify) {
      callerpres_deprecate_notify = 1;
      ast_log(LOG_WARNING, "CALLERPRES is deprecated."
         "  Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
   }
   ast_copy_string(buf,
      ast_named_caller_presentation(ast_party_id_presentation(&chan->caller.id)), len);
   return 0;
}
static int callerpres_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 837 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_name::presentation, and ast_party_number::presentation.

{
   int pres;

   if (!callerpres_deprecate_notify) {
      callerpres_deprecate_notify = 1;
      ast_log(LOG_WARNING, "CALLERPRES is deprecated."
         "  Use CALLERID(name-pres) or CALLERID(num-pres) instead.\n");
   }

   pres = ast_parse_caller_presentation(value);
   if (pres < 0) {
      ast_log(LOG_WARNING, "'%s' is not a valid presentation (see 'show function CALLERPRES')\n", value);
   } else {
      chan->caller.id.name.presentation = pres;
      chan->caller.id.number.presentation = pres;
   }
   return 0;
}
static int connectedline_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 1180 of file func_callerid.c.

References ast_party_members::argc, ast_party_members::argv, 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, status, and ast_party_members::subnames.

{
   struct ast_party_members member;
   char *read_what;
   enum ID_FIELD_STATUS status;

   /* Ensure that the buffer is empty */
   *buf = 0;

   if (!chan) {
      return -1;
   }

   read_what = ast_strdupa(data);
   AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   ast_channel_lock(chan);

   if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
      ast_copy_string(buf, ast_connected_line_source_name(chan->connected.source), len);
   } else {
      status = party_id_read(buf, len, member.argc, member.argv, &chan->connected.id);
      switch (status) {
      case ID_FIELD_VALID:
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
         break;
      }
   }

   ast_channel_unlock(chan);

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

Definition at line 1233 of file func_callerid.c.

References ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_app_parse_options(), ast_channel_lock, ast_channel_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(), connected, ast_channel::connected, CONNECTED_LINE_OPT_ARG_ARRAY_SIZE, CONNECTED_LINE_OPT_INHIBIT, connectedline_opts, ast_party_connected_line::id, ID_FIELD_INVALID, ID_FIELD_VALID, LOG_ERROR, ast_party_func_args::member, ast_party_func_args::opts, party_id_write(), ast_party_connected_line::source, status, ast_party_members::subnames, and update().

{
   struct ast_party_connected_line connected;
   enum ID_FIELD_STATUS status;
   char *val;
   char *parms;
   void (*set_it)(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update);
   struct ast_party_func_args args;
   struct ast_party_members member;
   struct ast_flags opts;
   char *opt_args[CONNECTED_LINE_OPT_ARG_ARRAY_SIZE];

   if (!value || !chan) {
      return -1;
   }

   parms = ast_strdupa(data);
   AST_STANDARD_APP_ARGS(args, parms);
   if (args.argc == 0) {
      /* Must have at least one argument. */
      return -1;
   }

   AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   if (ast_app_parse_options(connectedline_opts, &opts, opt_args, args.opts)) {
      /* General invalid option syntax. */
      return -1;
   }

   /* Determine if the update indication inhibit option is present */
   if (ast_test_flag(&opts, CONNECTED_LINE_OPT_INHIBIT)) {
      set_it = ast_channel_set_connected_line;
   } else {
      set_it = ast_channel_update_connected_line;
   }

   ast_channel_lock(chan);
   ast_party_connected_line_set_init(&connected, &chan->connected);
   ast_channel_unlock(chan);

   value = ast_skip_blanks(value);

   if (member.argc == 1 && !strcasecmp("source", member.argv[0])) {
      int source;

      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         source = atoi(val);
      } else {
         source = ast_connected_line_source_parse(val);
      }

      if (source < 0) {
         ast_log(LOG_ERROR, "Unknown connectedline source '%s', value unchanged\n", val);
      } else {
         connected.source = source;
         set_it(chan, &connected, NULL);
      }
   } else {
      status = party_id_write(&connected.id, member.argc, member.argv, value);
      switch (status) {
      case ID_FIELD_VALID:
         set_it(chan, &connected, NULL);
         break;
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown connectedline data type '%s'.\n", data);
         break;
      }
      ast_party_connected_line_free(&connected);
   }

   return 0;
}
static 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_name::str, ast_party_number::str, ast_party_id::subaddress, ast_party_id::tag, ast_party_name::valid, and ast_party_number::valid.

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

{
   enum ID_FIELD_STATUS status;

   if (argc == 0) {
      /* Must have at least one subname. */
      return ID_FIELD_UNKNOWN;
   }

   status = ID_FIELD_VALID;

   if (argc == 1 && !strcasecmp("all", argv[0])) {
      snprintf(buf, len, "\"%s\" <%s>",
          S_COR(id->name.valid, id->name.str, ""),
          S_COR(id->number.valid, id->number.str, ""));
   } else if (!strcasecmp("name", argv[0])) {
      status = party_name_read(buf, len, argc - 1, argv + 1, &id->name);
   } else if (!strncasecmp("num", argv[0], 3)) {
      /* Accept num[ber] */
      status = party_number_read(buf, len, argc - 1, argv + 1, &id->number);
   } else if (!strncasecmp("subaddr", argv[0], 7)) {
      /* Accept subaddr[ess] */
      status = party_subaddress_read(buf, len, argc - 1, argv + 1, &id->subaddress);
   } else if (argc == 1 && !strcasecmp("tag", argv[0])) {
      if (id->tag) {
         ast_copy_string(buf, id->tag, len);
      }
   } else if (argc == 1 && !strcasecmp("ton", argv[0])) {
      /* ton is an alias for num-plan */
      snprintf(buf, len, "%d", id->number.plan);
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      /*
       * Accept pres[entation]
       * This is the combined name/number presentation.
       */
      ast_copy_string(buf,
         ast_named_caller_presentation(ast_party_id_presentation(id)), len);
   } else {
      status = ID_FIELD_UNKNOWN;
   }

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

Definition at line 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, name, ast_party_id::name, ast_party_id::number, party_name_write(), party_number_write(), party_subaddress_write(), status, ast_party_name::str, ast_party_number::str, ast_party_id::subaddress, and ast_party_id::tag.

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

{
   char *val;
   enum ID_FIELD_STATUS status;

   if (argc == 0) {
      /* Must have at least one subname. */
      return ID_FIELD_UNKNOWN;
   }

   status = ID_FIELD_VALID;

   if (argc == 1 && !strcasecmp("all", argv[0])) {
      char name[256];
      char num[256];

      ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
      id->name.valid = 1;
      id->name.str = ast_strdup(name);
      if (!id->name.str) {
         return ID_FIELD_INVALID;
      }
      id->number.valid = 1;
      id->number.str = ast_strdup(num);
      if (!id->number.str) {
         return ID_FIELD_INVALID;
      }
   } else if (!strcasecmp("name", argv[0])) {
      status = party_name_write(&id->name, argc - 1, argv + 1, value);
   } else if (!strncasecmp("num", argv[0], 3)) {
      /* Accept num[ber] */
      status = party_number_write(&id->number, argc - 1, argv + 1, value);
   } else if (!strncasecmp("subaddr", argv[0], 7)) {
      /* Accept subaddr[ess] */
      status = party_subaddress_write(&id->subaddress, argc - 1, argv + 1, value);
   } else if (argc == 1 && !strcasecmp("tag", argv[0])) {
      id->tag = ast_strdup(value);
      ast_trim_blanks(id->tag);
   } else if (argc == 1 && !strcasecmp("ton", argv[0])) {
      /* ton is an alias for num-plan */
      argv[0] = "plan";
      status = party_number_write(&id->number, argc, argv, value);
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      int pres;

      /*
       * Accept pres[entation]
       * This is the combined name/number presentation.
       */
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         pres = atoi(val);
      } else {
         pres = ast_parse_caller_presentation(val);
      }

      if (pres < 0) {
         ast_log(LOG_ERROR,
            "Unknown combined presentation '%s', value unchanged\n", val);
         status = ID_FIELD_INVALID;
      } else {
         id->name.presentation = pres;
         id->number.presentation = pres;
      }
   } else {
      status = ID_FIELD_UNKNOWN;
   }

   return status;
}
static enum ID_FIELD_STATUS party_name_read ( char *  buf,
size_t  len,
int  argc,
char *  argv[],
const struct ast_party_name name 
) [static]

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

{
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We want the name string */
      if (name->valid && name->str) {
         ast_copy_string(buf, name->str, len);
      }
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      snprintf(buf, len, "%d", name->valid);
   } else if (argc == 1 && !strcasecmp("charset", argv[0])) {
      ast_copy_string(buf, ast_party_name_charset_str(name->char_set), len);
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      /* Accept pres[entation] */
      ast_copy_string(buf, ast_named_caller_presentation(name->presentation), len);
   } else {
      status = ID_FIELD_UNKNOWN;
   }

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

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

{
   char *val;
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We are setting the name string */
      name->valid = 1;
      name->str = ast_strdup(value);
      ast_trim_blanks(name->str);
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      name->valid = atoi(value) ? 1 : 0;
   } else if (argc == 1 && !strcasecmp("charset", argv[0])) {
      int char_set;

      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         char_set = atoi(val);
      } else {
         char_set = ast_party_name_charset_parse(val);
      }

      if (char_set < 0) {
         ast_log(LOG_ERROR,
            "Unknown name char-set '%s', value unchanged\n", val);
         status = ID_FIELD_INVALID;
      } else {
         name->char_set = char_set;
      }
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      int pres;

      /* Accept pres[entation] */
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         pres = atoi(val);
      } else {
         pres = ast_parse_caller_presentation(val);
      }

      if (pres < 0) {
         ast_log(LOG_ERROR,
            "Unknown name presentation '%s', value unchanged\n", val);
         status = ID_FIELD_INVALID;
      } else {
         name->presentation = pres;
      }
   } else {
      status = ID_FIELD_UNKNOWN;
   }

   return status;
}
static enum ID_FIELD_STATUS party_number_read ( char *  buf,
size_t  len,
int  argc,
char *  argv[],
const struct ast_party_number number 
) [static]

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

{
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We want the number string */
      if (number->valid && number->str) {
         ast_copy_string(buf, number->str, len);
      }
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      snprintf(buf, len, "%d", number->valid);
   } else if (argc == 1 && !strcasecmp("plan", argv[0])) {
      snprintf(buf, len, "%d", number->plan);
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      /* Accept pres[entation] */
      ast_copy_string(buf, ast_named_caller_presentation(number->presentation), len);
   } else {
      status = ID_FIELD_UNKNOWN;
   }

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

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

{
   char *val;
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We are setting the number string */
      number->valid = 1;
      number->str = ast_strdup(value);
      ast_trim_blanks(number->str);
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      number->valid = atoi(value) ? 1 : 0;
   } else if (argc == 1 && !strcasecmp("plan", argv[0])) {
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         number->plan = atoi(val);
      } else {
         ast_log(LOG_ERROR,
            "Unknown type-of-number/numbering-plan '%s', value unchanged\n", val);
         status = ID_FIELD_INVALID;
      }
   } else if (argc == 1 && !strncasecmp("pres", argv[0], 4)) {
      int pres;

      /* Accept pres[entation] */
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         pres = atoi(val);
      } else {
         pres = ast_parse_caller_presentation(val);
      }

      if (pres < 0) {
         ast_log(LOG_ERROR,
            "Unknown number presentation '%s', value unchanged\n", val);
         status = ID_FIELD_INVALID;
      } else {
         number->presentation = pres;
      }
   } else {
      status = ID_FIELD_UNKNOWN;
   }

   return status;
}
static enum ID_FIELD_STATUS party_subaddress_read ( char *  buf,
size_t  len,
int  argc,
char *  argv[],
const struct ast_party_subaddress subaddress 
) [static]

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

{
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We want the subaddress string */
      if (subaddress->str) {
         ast_copy_string(buf, subaddress->str, len);
      }
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      snprintf(buf, len, "%d", subaddress->valid);
   } else if (argc == 1 && !strcasecmp("type", argv[0])) {
      snprintf(buf, len, "%d", subaddress->type);
   } else if (argc == 1 && !strcasecmp("odd", argv[0])) {
      snprintf(buf, len, "%d", subaddress->odd_even_indicator);
   } else {
      status = ID_FIELD_UNKNOWN;
   }

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

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

{
   enum ID_FIELD_STATUS status;

   status = ID_FIELD_VALID;

   if (argc == 0) {
      /* We are setting the subaddress string */
      subaddress->str = ast_strdup(value);
      ast_trim_blanks(subaddress->str);
   } else if (argc == 1 && !strcasecmp("valid", argv[0])) {
      subaddress->valid = atoi(value) ? 1 : 0;
   } else if (argc == 1 && !strcasecmp("type", argv[0])) {
      subaddress->type = atoi(value) ? 2 : 0;
   } else if (argc == 1 && !strcasecmp("odd", argv[0])) {
      subaddress->odd_even_indicator = atoi(value) ? 1 : 0;
   } else {
      status = ID_FIELD_UNKNOWN;
   }

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

Definition at line 1329 of file func_callerid.c.

References ast_party_members::argc, ast_party_members::argv, 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, ast_party_members::subnames, and ast_party_redirecting::to.

{
   struct ast_party_members member;
   char *read_what;
   enum ID_FIELD_STATUS status;

   /* Ensure that the buffer is empty */
   *buf = 0;

   if (!chan) {
      return -1;
   }

   read_what = ast_strdupa(data);
   AST_NONSTANDARD_APP_ARGS(member, read_what, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   ast_channel_lock(chan);

   if (!strcasecmp("from", member.argv[0])) {
      status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
         &chan->redirecting.from);
      switch (status) {
      case ID_FIELD_VALID:
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
         break;
      }
   } else if (!strcasecmp("to", member.argv[0])) {
      status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
         &chan->redirecting.to);
      switch (status) {
      case ID_FIELD_VALID:
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
         break;
      }
   } else if (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
      /*
       * Accept pres[entation]
       * This is the combined from name/number presentation.
       */
      ast_copy_string(buf,
         ast_named_caller_presentation(
            ast_party_id_presentation(&chan->redirecting.from)), len);
   } else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
      ast_copy_string(buf, ast_redirecting_reason_name(chan->redirecting.reason), len);
   } else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
      snprintf(buf, len, "%d", chan->redirecting.count);
   } else {
      ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
   }

   ast_channel_unlock(chan);

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

Definition at line 1406 of file func_callerid.c.

References ast_party_func_args::argc, ast_party_members::argc, ast_party_members::argv, ARRAY_LEN, ast_app_parse_options(), ast_channel_lock, ast_channel_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_func_args::member, ast_party_id::name, ast_party_id::number, ast_party_func_args::opts, party_id_write(), ast_party_name::presentation, ast_party_number::presentation, ast_party_redirecting::reason, ast_channel::redirecting, REDIRECTING_OPT_ARG_ARRAY_SIZE, REDIRECTING_OPT_INHIBIT, redirecting_opts, status, ast_party_members::subnames, ast_party_redirecting::to, and update().

{
   struct ast_party_redirecting redirecting;
   enum ID_FIELD_STATUS status;
   char *val;
   char *parms;
   void (*set_it)(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
   struct ast_party_func_args args;
   struct ast_party_members member;
   struct ast_flags opts;
   char *opt_args[REDIRECTING_OPT_ARG_ARRAY_SIZE];

   if (!value || !chan) {
      return -1;
   }

   parms = ast_strdupa(data);
   AST_STANDARD_APP_ARGS(args, parms);
   if (args.argc == 0) {
      /* Must have at least one argument. */
      return -1;
   }

   AST_NONSTANDARD_APP_ARGS(member, args.member, '-');
   if (member.argc == 0 || ARRAY_LEN(member.subnames) <= member.argc) {
      /* Too few or too many subnames */
      return -1;
   }

   if (ast_app_parse_options(redirecting_opts, &opts, opt_args, args.opts)) {
      /* General invalid option syntax. */
      return -1;
   }

   /* Determine if the update indication inhibit option is present */
   if (ast_test_flag(&opts, REDIRECTING_OPT_INHIBIT)) {
      set_it = ast_channel_set_redirecting;
   } else {
      set_it = ast_channel_update_redirecting;
   }

   ast_channel_lock(chan);
   ast_party_redirecting_set_init(&redirecting, &chan->redirecting);
   ast_channel_unlock(chan);

   value = ast_skip_blanks(value);

   if (!strcasecmp("from", member.argv[0])) {
      status = party_id_write(&redirecting.from, member.argc - 1, member.argv + 1,
         value);
      switch (status) {
      case ID_FIELD_VALID:
         set_it(chan, &redirecting, NULL);
         break;
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
         break;
      }
      ast_party_redirecting_free(&redirecting);
   } else if (!strcasecmp("to", member.argv[0])) {
      status = party_id_write(&redirecting.to, member.argc - 1, member.argv + 1, value);
      switch (status) {
      case ID_FIELD_VALID:
         set_it(chan, &redirecting, NULL);
         break;
      case ID_FIELD_INVALID:
         break;
      default:
         ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
         break;
      }
      ast_party_redirecting_free(&redirecting);
   } else if (member.argc == 1 && !strncasecmp("pres", member.argv[0], 4)) {
      int pres;

      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         pres = atoi(val);
      } else {
         pres = ast_parse_caller_presentation(val);
      }

      if (pres < 0) {
         ast_log(LOG_ERROR,
            "Unknown redirecting combined presentation '%s', value unchanged\n", val);
      } else {
         redirecting.from.name.presentation = pres;
         redirecting.from.number.presentation = pres;
         redirecting.to.name.presentation = pres;
         redirecting.to.number.presentation = pres;
         set_it(chan, &redirecting, NULL);
      }
   } else if (member.argc == 1 && !strcasecmp("reason", member.argv[0])) {
      int reason;

      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         reason = atoi(val);
      } else {
         reason = ast_redirecting_reason_parse(val);
      }

      if (reason < 0) {
         ast_log(LOG_ERROR, "Unknown redirecting reason '%s', value unchanged\n", val);
      } else {
         redirecting.reason = reason;
         set_it(chan, &redirecting, NULL);
      }
   } else if (member.argc == 1 && !strcasecmp("count", member.argv[0])) {
      val = ast_strdupa(value);
      ast_trim_blanks(val);

      if (('0' <= val[0]) && (val[0] <= '9')) {
         redirecting.count = atoi(val);
         set_it(chan, &redirecting, NULL);
      } else {
         ast_log(LOG_ERROR, "Unknown redirecting count '%s', value unchanged\n", val);
      }
   } else {
      ast_log(LOG_ERROR, "Unknown redirecting data type '%s'.\n", data);
   }

   return 0;
}

Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting)" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 1600 of file func_callerid.c.

Definition at line 1600 of file func_callerid.c.

Definition at line 1537 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 1544 of file func_callerid.c.

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

Definition at line 1551 of file func_callerid.c.

struct ast_app_option connectedline_opts[128] = { [ 'i' ] = { .flag = CONNECTED_LINE_OPT_INHIBIT }, } [static]

Definition at line 343 of file func_callerid.c.

Referenced by connectedline_write().

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

Definition at line 1557 of file func_callerid.c.

struct ast_app_option redirecting_opts[128] = { [ 'i' ] = { .flag = REDIRECTING_OPT_INHIBIT }, } [static]

Definition at line 357 of file func_callerid.c.

Referenced by redirecting_write().