mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
sig_analog: Add fuller Caller ID support.
A previous change, ASTERISK_29991, made it possible to send additional Caller ID parameters that were not previously supported. This change adds support for analog DAHDI channels to now be able to receive these parameters for on-hook Caller ID, in order to enhance the usability of CPE that support these parameters. Resolves: #94 ASTERISK-30331 UserNote: Additional Caller ID properties are now supported on incoming calls to FXS stations, namely the redirecting reason and call qualifier.
This commit is contained in:
@@ -1645,6 +1645,7 @@ static int my_callwait(void *pvt)
|
||||
static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *caller)
|
||||
{
|
||||
struct dahdi_pvt *p = pvt;
|
||||
struct analog_pvt *analog_p = p->sig_pvt;
|
||||
|
||||
ast_debug(2, "Starting cid spill\n");
|
||||
|
||||
@@ -1656,13 +1657,20 @@ static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *calle
|
||||
if ((p->cidspill = ast_malloc(MAX_CALLERID_SIZE))) {
|
||||
int pres = ast_party_id_presentation(&caller->id);
|
||||
if (cwcid == 0) {
|
||||
/* Some CPE support additional parameters for on-hook Caller*ID,
|
||||
* such as redirecting reason and call qualifier, so send those
|
||||
* if available.
|
||||
* I don't know of any CPE that supports this for Call Waiting (unfortunately),
|
||||
* so don't send those for call waiting as that will just lengthen the CID spill
|
||||
* for no good reason.
|
||||
*/
|
||||
p->cidlen = ast_callerid_full_generate(p->cidspill,
|
||||
caller->id.name.str,
|
||||
caller->id.number.str,
|
||||
NULL,
|
||||
-1,
|
||||
analog_p->redirecting_reason,
|
||||
pres,
|
||||
0,
|
||||
analog_p->call_qualifier,
|
||||
CID_TYPE_MDMF,
|
||||
AST_LAW(p));
|
||||
} else {
|
||||
|
@@ -1073,6 +1073,8 @@ int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Name and Number */
|
||||
n = ast_channel_connected(ast)->id.name.valid ? ast_channel_connected(ast)->id.name.str : NULL;
|
||||
l = ast_channel_connected(ast)->id.number.valid ? ast_channel_connected(ast)->id.number.str : NULL;
|
||||
if (l) {
|
||||
@@ -1087,12 +1089,25 @@ int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest
|
||||
}
|
||||
|
||||
if (p->use_callerid) {
|
||||
const char *qual_var;
|
||||
|
||||
/* Caller ID Name and Number */
|
||||
p->caller.id.name.str = p->lastcid_name;
|
||||
p->caller.id.number.str = p->lastcid_num;
|
||||
p->caller.id.name.valid = ast_channel_connected(ast)->id.name.valid;
|
||||
p->caller.id.number.valid = ast_channel_connected(ast)->id.number.valid;
|
||||
p->caller.id.name.presentation = ast_channel_connected(ast)->id.name.presentation;
|
||||
p->caller.id.number.presentation = ast_channel_connected(ast)->id.number.presentation;
|
||||
|
||||
/* Redirecting Reason */
|
||||
p->redirecting_reason = ast_channel_redirecting(ast)->from.number.valid ? ast_channel_redirecting(ast)->reason.code : -1;
|
||||
|
||||
/* Call Qualifier */
|
||||
ast_channel_lock(ast);
|
||||
/* XXX In the future, we may want to make this a CALLERID or CHANNEL property and fetch it from there. */
|
||||
qual_var = pbx_builtin_getvar_helper(ast, "CALL_QUALIFIER");
|
||||
p->call_qualifier = ast_true(qual_var) ? 1 : 0;
|
||||
ast_channel_unlock(ast);
|
||||
}
|
||||
|
||||
ast_setstate(ast, AST_STATE_RINGING);
|
||||
|
@@ -342,12 +342,15 @@ struct analog_pvt {
|
||||
* gives a positive reply.
|
||||
*/
|
||||
unsigned int callwaitcas:1;
|
||||
unsigned int call_qualifier:1; /*!< Call qualifier delivery */
|
||||
|
||||
char callwait_num[AST_MAX_EXTENSION];
|
||||
char callwait_name[AST_MAX_EXTENSION];
|
||||
char lastcid_num[AST_MAX_EXTENSION];
|
||||
char lastcid_name[AST_MAX_EXTENSION];
|
||||
struct ast_party_caller caller;
|
||||
int redirecting_reason; /*!< Redirecting reason */
|
||||
|
||||
int cidrings; /*!< Which ring to deliver CID on */
|
||||
char echorest[20];
|
||||
int polarity;
|
||||
|
Reference in New Issue
Block a user