diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 8897bb6954..36d2c08110 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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 { diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 8d5ccd64fc..9addccbb89 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -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); diff --git a/channels/sig_analog.h b/channels/sig_analog.h index 07e1cdd2aa..690326bfda 100644 --- a/channels/sig_analog.h +++ b/channels/sig_analog.h @@ -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; diff --git a/configs/samples/chan_dahdi.conf.sample b/configs/samples/chan_dahdi.conf.sample index c54f482566..2dadb31af9 100644 --- a/configs/samples/chan_dahdi.conf.sample +++ b/configs/samples/chan_dahdi.conf.sample @@ -572,6 +572,15 @@ context=public ; usecallerid=yes ; +; NOTE: If the CALL_QUALIFIER variable on the channel is set to 1, +; the Stentor Call Qualifier parameter will be sent for Caller ID spills +; using the Multiple Data Message Format (MDMF). +; This is used by capable Caller ID units to activate the +; "LDC" (Long Distance Call) indicator. +; This variable is not automatically set anywhere. You are responsible +; for setting it in the dialplan if you want to activate the indicator, +; and you must have compatible CPE. +; ; Type of caller ID signalling in use ; bell = bell202 as used in US (default) ; v23 = v23 as used in the UK diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 448f54696d..7ecf9f9c6e 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -182,6 +182,21 @@ Number Unavailable. + + + This is a special Caller ID-related variable + that can be used to enable sending the Call Qualifier + parameter in MDMF (Multiple Data Message Format) + Caller ID spills. + This variable is not automatically set by Asterisk. + You are responsible for setting it if/when needed. + Supporting Caller ID units will display the LDC + (Long Distance Call) indicator when they receive this parameter. + This option must be used with a channel driver + that allows Asterisk to generate the Caller ID spill, + which currently only includes chan_dahdi. + +