Skip to content
Snippets Groups Projects
Commit 500353e0 authored by Paul Cadach's avatar Paul Cadach
Browse files

Extend CALLERID() function for "pres" and "ton" values

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@44685 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 901a66c4
No related branches found
No related tags found
No related merge requests found
......@@ -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.
......@@ -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,
......
......@@ -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
......
......@@ -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";
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment