Extend CALLERID() function for "pres" and "ton" values
authorPaul Cadach <paul@odt.east.telecom.kz>
Sat, 7 Oct 2006 14:45:49 +0000 (14:45 +0000)
committerPaul Cadach <paul@odt.east.telecom.kz>
Sat, 7 Oct 2006 14:45:49 +0000 (14:45 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@44685 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
funcs/func_callerid.c
include/asterisk/callerid.h
main/callerid.c

diff --git a/CHANGES b/CHANGES
index 4625ee0..6cb3603 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -37,3 +37,6 @@ Changes since Asterisk 1.4-beta was branched:
      Read() - timeout now can be floating pt.
      WaitForRing() now takes floating pt timeout arg.
      SpeechBackground() -- clarified in the docstrings that the timeout is an integer seconds.
+  * Extend CALLERID() function with "pres" and "ton" parameters to
+     fetch string representation of calling number presentation indicator
+     and numeric representation of type of calling number value.
index 6068739..5af8e1c 100644 (file)
@@ -87,6 +87,10 @@ static int callerid_read(struct ast_channel *chan, char *cmd, char *data,
                        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);
                }
@@ -124,6 +128,34 @@ static int callerid_write(struct ast_channel *chan, char *cmd, char *data,
                if (chan->cid.cid_rdnis)
                        free(chan->cid.cid_rdnis);
                chan->cid.cid_rdnis = ast_strdup(value);
+       } else if (!strncasecmp("pres", data, 4)) {
+               int i;
+               char *s, *val;
+
+               /* Strip leading spaces */
+               while ((value[0] == '\t') || (value[0] == ' '))
+                       ++value;
+
+               val = ast_strdupa(value);
+
+               /* Strip trailing spaces */
+               s = val + strlen(val);
+               while ((s != val) && ((s[-1] == '\t') || (s[-1] == ' ')))
+                       --s;
+               *s = '\0';
+
+               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)) {
+               int i = atoi(value);
+               chan->cid.cid_ton = i;
        } else {
                ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
        }
@@ -137,7 +169,8 @@ static struct ast_custom_function callerid_function = {
        .syntax = "CALLERID(datatype[,<optional-CID>])",
        .desc =
                "Gets or sets Caller*ID data on the channel.  The allowable datatypes\n"
-               "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n"
+               "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\", \"pres\",\n"
+               "and \"ton\".\n"
                "Uses channel callerid by default or optional callerid, if specified.\n",
        .read = callerid_read,
        .write = callerid_write,
index 7347dd9..bf4030e 100644 (file)
@@ -311,6 +311,7 @@ static inline float callerid_getcarrier(float *cr, float *ci, int bit)
 
 int ast_parse_caller_presentation(const char *data);
 const char *ast_describe_caller_presentation(int data);
+const char *ast_named_caller_presentation(int data);
 
 /*! \page Def_CallerPres Caller ID Presentation
 
index 98cb7d0..6bb916b 100644 (file)
@@ -1048,8 +1048,8 @@ int ast_callerid_split(const char *buf, char *name, int namelen, char *num, int
 /*! \brief Translation table for Caller ID Presentation settings */
 static struct {
        int val;
-       char *name;
-       char *description;
+       const char *name;
+       const char *description;
 } pres_types[] = {
        {  AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, "allowed_not_screened", "Presentation Allowed, Not Screened"},
        {  AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, "allowed_passed_screen", "Presentation Allowed, Passed Screen"},
@@ -1094,3 +1094,19 @@ const char *ast_describe_caller_presentation(int data)
 
        return "unknown";
 }
+
+/*! \brief Convert caller ID pres value to text code
+       \param data text string
+       \return string for config file
+*/
+const char *ast_named_caller_presentation(int data)
+{
+       int i;
+
+       for (i = 0; i < ((sizeof(pres_types) / sizeof(pres_types[0]))); i++) {
+               if (pres_types[i].val == data)
+                       return pres_types[i].name;
+       }
+
+       return "unknown";
+}