mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
chan_dahdi: Fix buggy and missing Caller ID parameters
There are several things wrong with analog Caller ID handling that are fixed by this commit: callerid.c's Caller ID generation function contains the logic to use the presentation to properly send the proper Caller ID. However, currently, DAHDI does not pass any presentation information to the Caller ID module, which means that presentation is completely ignored on all calls. This means that lines could be getting Caller ID information they aren't supposed to. Part of the reason this has been obscured is because the simple switch logic for handling the built in *67 and *82 is completely wrong. Rather than modifying the presentation for the call accordingly (which is what it's supposed to do), it simply blanks out the Caller ID or fills it in. This is wrong, so wrong that it makes a mockery of the specification. Additionally, it would leave to the "UNAVAILABLE" disposition being used for Caller ID generation as opposed to the "PRIVATE" disposition that it should have been using. This is now fixed to only update the presentation and not modify the number and name, so that the simple switch *67/*82 work correctly. Next, sig_analog currently only copies over the name and number, nothing else, when it is filling in a duplicated caller id structure. Thus, we also now copy over the presentation information so that is available for the Caller ID spill. Additionally, this meant that "valid" was implicitly 0, and as such presentation would always fail to "Unavailable". The validity is therefore also copied over so it can be used by ast_party_id_presentation. As part of this fix, new API is added so that all the relevant Caller ID information can be passed in to the Caller ID generation functions. Parameters that are also completely missing from the Caller ID spill have also been added, to enhance the compatibility, correctness, and completeness of the Asterisk Caller ID implementation. ASTERISK-29991 #close Change-Id: Icc44a5e09979916f4c18a440f96e10dc1c76ae15
This commit is contained in:
committed by
Friendly Automation
parent
ba51a05a6f
commit
d2746b6e99
@@ -1089,6 +1089,10 @@ int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest
|
||||
if (p->use_callerid) {
|
||||
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;
|
||||
}
|
||||
|
||||
ast_setstate(ast, AST_STATE_RINGING);
|
||||
@@ -2264,10 +2268,8 @@ static void *__analog_ss_thread(void *data)
|
||||
ast_verb(3, "Disabling Caller*ID on %s\n", ast_channel_name(chan));
|
||||
/* Disable Caller*ID if enabled */
|
||||
p->hidecallerid = 1;
|
||||
ast_party_number_free(&ast_channel_caller(chan)->id.number);
|
||||
ast_party_number_init(&ast_channel_caller(chan)->id.number);
|
||||
ast_party_name_free(&ast_channel_caller(chan)->id.name);
|
||||
ast_party_name_init(&ast_channel_caller(chan)->id.name);
|
||||
ast_channel_caller(chan)->id.number.presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
|
||||
ast_channel_caller(chan)->id.name.presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
|
||||
res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Unable to do dial recall on channel %s: %s\n",
|
||||
@@ -2353,7 +2355,8 @@ static void *__analog_ss_thread(void *data)
|
||||
ast_verb(3, "Enabling Caller*ID on %s\n", ast_channel_name(chan));
|
||||
/* Enable Caller*ID if enabled */
|
||||
p->hidecallerid = 0;
|
||||
ast_set_callerid(chan, p->cid_num, p->cid_name, NULL);
|
||||
ast_channel_caller(chan)->id.number.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
|
||||
ast_channel_caller(chan)->id.name.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
|
||||
res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Unable to do dial recall on channel %s: %s\n",
|
||||
|
Reference in New Issue
Block a user