Thu Apr 28 2011 17:13:55

Asterisk developer's documentation


func_callerid.c File Reference

Caller ID related dialplan functions. 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.

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 load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Caller ID related dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_custom_function callerid_function
static struct ast_custom_function callerpres_function

Detailed Description

Caller ID related dialplan functions.

Definition in file func_callerid.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 307 of file func_callerid.c.

static void __unreg_module ( void  ) [static]

Definition at line 307 of file func_callerid.c.

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

Definition at line 120 of file func_callerid.c.

References ast_callerid_split(), ast_channel_lock, ast_channel_unlock, ast_copy_string(), ast_log(), ast_named_caller_presentation(), ast_channel::cid, ast_callerid::cid_ani, ast_callerid::cid_ani2, ast_callerid::cid_dnid, ast_callerid::cid_name, ast_callerid::cid_num, ast_callerid::cid_pres, ast_callerid::cid_rdnis, ast_callerid::cid_ton, LOG_ERROR, name, num, S_OR, and strsep().

{
   char *opt = data;

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

   if (!chan)
      return -1;

   if (strchr(opt, ',')) {
      char name[80], num[80];

      data = strsep(&opt, ",");
      ast_callerid_split(opt, name, sizeof(name), num, sizeof(num));

      if (!strncasecmp("all", data, 3)) {
         snprintf(buf, len, "\"%s\" <%s>", name, num);
      } else if (!strncasecmp("name", data, 4)) {
         ast_copy_string(buf, name, len);
      } else if (!strncasecmp("num", data, 3)) {
         /* also matches "number" */
         ast_copy_string(buf, num, len);
      } else {
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
      }
   } else {
      ast_channel_lock(chan);

      if (!strncasecmp("all", data, 3)) {
         snprintf(buf, len, "\"%s\" <%s>",
            S_OR(chan->cid.cid_name, ""),
            S_OR(chan->cid.cid_num, ""));
      } else if (!strncasecmp("name", data, 4)) {
         if (chan->cid.cid_name) {
            ast_copy_string(buf, chan->cid.cid_name, len);
         }
      } else if (!strncasecmp("num", data, 3)) {
         /* also matches "number" */
         if (chan->cid.cid_num) {
            ast_copy_string(buf, chan->cid.cid_num, len);
         }
      } else if (!strncasecmp("ani", data, 3)) {
         if (!strncasecmp(data + 3, "2", 1)) {
            snprintf(buf, len, "%d", chan->cid.cid_ani2);
         } else if (chan->cid.cid_ani) {
            ast_copy_string(buf, chan->cid.cid_ani, len);
         }
      } else if (!strncasecmp("dnid", data, 4)) {
         if (chan->cid.cid_dnid) {
            ast_copy_string(buf, chan->cid.cid_dnid, len);
         }
      } else if (!strncasecmp("rdnis", data, 5)) {
         if (chan->cid.cid_rdnis) {
            ast_copy_string(buf, chan->cid.cid_rdnis, len);
         }
      } else if (!strncasecmp("pres", data, 4)) {
         ast_copy_string(buf, ast_named_caller_presentation(chan->cid.cid_pres), len);
      } else if (!strncasecmp("ton", data, 3)) {
         snprintf(buf, len, "%d", chan->cid.cid_ton);
      } else {
         ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
      }

      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 191 of file func_callerid.c.

References ast_callerid_split(), ast_cdr_setcid(), ast_channel_lock, ast_channel_unlock, ast_free, ast_log(), ast_parse_caller_presentation(), ast_set_callerid(), ast_skip_blanks(), ast_strdup, ast_strdupa, ast_trim_blanks(), ast_channel::cdr, ast_channel::cid, ast_callerid::cid_ani2, ast_callerid::cid_dnid, ast_callerid::cid_pres, ast_callerid::cid_rdnis, ast_callerid::cid_tns, ast_callerid::cid_ton, LOG_ERROR, name, num, and val.

{
   int valid = 1;
   if (!value || !chan)
      return -1;

   value = ast_skip_blanks(value);

   if (!strncasecmp("all", data, 3)) {
      char name[256];
      char num[256];

      ast_callerid_split(value, name, sizeof(name), num, sizeof(num));
      ast_set_callerid(chan, num, name, num);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
   } else if (!strncasecmp("name", data, 4)) {
      ast_set_callerid(chan, NULL, value, NULL);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
   } else if (!strncasecmp("num", data, 3)) {
      /* also matches "number" */
      ast_set_callerid(chan, value, NULL, NULL);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
   } else if (!strncasecmp("ani", data, 3)) {
      if (!strncasecmp(data + 3, "2", 1)) {
         chan->cid.cid_ani2 = atoi(value);
      } else {
         ast_set_callerid(chan, NULL, NULL, value);
      }
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
   } else if (!strncasecmp("dnid", data, 4)) {
      ast_channel_lock(chan);
      if (chan->cid.cid_dnid) {
         ast_free(chan->cid.cid_dnid);
      }
      chan->cid.cid_dnid = ast_strdup(value);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
      ast_channel_unlock(chan);
   } else if (!strncasecmp("rdnis", data, 5)) {
      ast_channel_lock(chan);
      if (chan->cid.cid_rdnis) {
         ast_free(chan->cid.cid_rdnis);
      }
      chan->cid.cid_rdnis = ast_strdup(value);
      if (chan->cdr) {
         ast_cdr_setcid(chan->cdr, chan);
      }
      ast_channel_unlock(chan);
   } else if (!strncasecmp("pres", data, 4)) {
      int i;
      char *val;

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

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

      if (i < 0) {
         ast_log(LOG_ERROR, "Unknown calling number presentation '%s', value unchanged\n", val);
      } else {
         chan->cid.cid_pres = i;
      }
   } else if (!strncasecmp("ton", data, 3)) {
      chan->cid.cid_ton = atoi(value);
   } else {
      ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
      valid = 0;
   }

   if (valid) {
      chan->cid.cid_tns = 1;
   }

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

Definition at line 110 of file func_callerid.c.

References ast_log(), ast_parse_caller_presentation(), ast_channel::cid, ast_callerid::cid_pres, and LOG_WARNING.

{
   int 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->cid.cid_pres = pres;
   return 0;
}
static int load_module ( void  ) [static]
static int unload_module ( void  ) [static]

Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Caller ID related dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 307 of file func_callerid.c.

Definition at line 307 of file func_callerid.c.

Initial value:
 {
   .name = "CALLERID",
   .read = callerid_read,
   .write = callerid_write,
}

Definition at line 281 of file func_callerid.c.

Initial value:
 {
   .name = "CALLERPRES",
   .read = callerpres_read,
   .write = callerpres_write,
}

Definition at line 287 of file func_callerid.c.