dect
/
asterisk
Archived
13
0
Fork 0

Expand the caller ANI field to an ast_party_id

Expand the ani field in ast_party_caller and ast_party_connected_line to
an ast_party_id.

This is an extension to the ast_callerid restructuring patch in review:
https://reviewboard.asterisk.org/r/702/

Review: https://reviewboard.asterisk.org/r/744/


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@276393 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
rmudgett 2010-07-14 16:58:03 +00:00
parent c7be695461
commit d93fa33a75
22 changed files with 166 additions and 98 deletions

View File

@ -189,7 +189,7 @@ static void isAnsweringMachine(struct ast_channel *chan, const char *data)
); );
ast_verb(3, "AMD: %s %s %s (Fmt: %s)\n", chan->name, ast_verb(3, "AMD: %s %s %s (Fmt: %s)\n", chan->name,
S_OR(chan->caller.ani, "(N/A)"), S_COR(chan->caller.ani.number.valid, chan->caller.ani.number.str, "(N/A)"),
S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, "(N/A)"), S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, "(N/A)"),
ast_getformatname(chan->readformat)); ast_getformatname(chan->readformat));

View File

@ -2923,18 +2923,17 @@ static void my_set_callerid(void *pvt, const struct ast_party_caller *caller)
ast_copy_string(p->cid_name, ast_copy_string(p->cid_name,
S_COR(caller->id.name.valid, caller->id.name.str, ""), S_COR(caller->id.name.valid, caller->id.name.str, ""),
sizeof(p->cid_name)); sizeof(p->cid_name));
if (caller->id.subaddress.valid) { ast_copy_string(p->cid_subaddr,
ast_copy_string(p->cid_subaddr, S_OR(caller->id.subaddress.str, ""), S_COR(caller->id.subaddress.valid, caller->id.subaddress.str, ""),
sizeof(p->cid_subaddr)); sizeof(p->cid_subaddr));
} else {
p->cid_subaddr[0] = '\0';
}
p->cid_ton = caller->id.number.plan; p->cid_ton = caller->id.number.plan;
p->callingpres = ast_party_id_presentation(&caller->id); p->callingpres = ast_party_id_presentation(&caller->id);
if (caller->id.tag) { if (caller->id.tag) {
ast_copy_string(p->cid_tag, caller->id.tag, sizeof(p->cid_tag)); ast_copy_string(p->cid_tag, caller->id.tag, sizeof(p->cid_tag));
} }
ast_copy_string(p->cid_ani, S_OR(caller->ani, ""), sizeof(p->cid_ani)); ast_copy_string(p->cid_ani,
S_COR(caller->ani.number.valid, caller->ani.number.str, ""),
sizeof(p->cid_ani));
p->cid_ani2 = caller->ani2; p->cid_ani2 = caller->ani2;
} }
#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */ #endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
@ -8187,10 +8186,12 @@ winkflashdone:
switch (p->whichwink) { switch (p->whichwink) {
case 0: case 0:
ast_debug(1, "ANI2 set to '%d' and ANI is '%s'\n", p->owner->caller.ani2, ast_debug(1, "ANI2 set to '%d' and ANI is '%s'\n", p->owner->caller.ani2,
S_OR(p->owner->caller.ani, "")); S_COR(p->owner->caller.ani.number.valid,
p->owner->caller.ani.number.str, ""));
snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%d%s#", snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%d%s#",
p->owner->caller.ani2, p->owner->caller.ani2,
S_OR(p->owner->caller.ani, "")); S_COR(p->owner->caller.ani.number.valid,
p->owner->caller.ani.number.str, ""));
break; break;
case 1: case 1:
ast_copy_string(p->dop.dialstr, p->finaldial, sizeof(p->dop.dialstr)); ast_copy_string(p->dop.dialstr, p->finaldial, sizeof(p->dop.dialstr));
@ -9201,12 +9202,18 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
#if defined(HAVE_PRI) || defined(HAVE_SS7) #if defined(HAVE_PRI) || defined(HAVE_SS7)
if (!ast_strlen_zero(i->cid_ani)) if (!ast_strlen_zero(i->cid_ani)) {
tmp->caller.ani = ast_strdup(i->cid_ani); tmp->caller.ani.number.valid = 1;
else tmp->caller.ani.number.str = ast_strdup(i->cid_ani);
tmp->caller.ani = ast_strdup(i->cid_num); } else if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
#else #else
tmp->caller.ani = ast_strdup(i->cid_num); if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */ #endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
tmp->caller.id.name.presentation = i->callingpres; tmp->caller.id.name.presentation = i->callingpres;
tmp->caller.id.number.presentation = i->callingpres; tmp->caller.id.number.presentation = i->callingpres;

View File

@ -1082,7 +1082,10 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
ch->caller.ani = ast_strdup(cid_num); if (!ast_strlen_zero(cid_num)) {
ch->caller.ani.number.valid = 1;
ch->caller.ani.number.str = ast_strdup(cid_num);
}
if (pvt->cd.redirect_reason >= 0) { if (pvt->cd.redirect_reason >= 0) {
ch->redirecting.from.number.valid = 1; ch->redirecting.from.number.valid = 1;

View File

@ -4971,8 +4971,11 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
if (n) if (n)
iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n); iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
if (ast_test_flag64(iaxs[callno], IAX_SENDANI) && c->connected.ani) if (ast_test_flag64(iaxs[callno], IAX_SENDANI)
iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->connected.ani); && c->connected.ani.number.valid
&& c->connected.ani.number.str) {
iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->connected.ani.number.str);
}
if (!ast_strlen_zero(c->language)) if (!ast_strlen_zero(c->language))
iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language); iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language);
@ -5604,9 +5607,11 @@ static struct ast_channel *ast_iax2_new(int callno, int state, format_t capabili
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a NewCallerID event before the NewChannel event */ * generate a NewCallerID event before the NewChannel event */
if (!ast_strlen_zero(i->ani)) { if (!ast_strlen_zero(i->ani)) {
tmp->caller.ani = ast_strdup(i->ani); tmp->caller.ani.number.valid = 1;
} else { tmp->caller.ani.number.str = ast_strdup(i->ani);
tmp->caller.ani = ast_strdup(i->cid_num); } else if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
} }
tmp->dialed.number.str = ast_strdup(i->dnid); tmp->dialed.number.str = ast_strdup(i->dnid);
tmp->redirecting.from.number.valid = 1; tmp->redirecting.from.number.valid = 1;

View File

@ -868,7 +868,10 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt *
ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten)); ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate an unnecessary NewCallerID event */ * generate an unnecessary NewCallerID event */
tmp->caller.ani = ast_strdup(i->cid_num); if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s")) { if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s")) {
tmp->dialed.number.str = ast_strdup(i->exten); tmp->dialed.number.str = ast_strdup(i->exten);
} }

View File

@ -1533,7 +1533,10 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state, cons
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
tmp->caller.ani = ast_strdup(i->cid_num); if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
if (!i->adsi) { if (!i->adsi) {
tmp->adsicpe = AST_ADSI_UNAVAILABLE; tmp->adsicpe = AST_ADSI_UNAVAILABLE;
@ -3002,7 +3005,7 @@ static void *mgcp_ss(void *data)
ast_set_callerid(chan, ast_set_callerid(chan,
p->hidecallerid ? "" : p->cid_num, p->hidecallerid ? "" : p->cid_num,
p->hidecallerid ? "" : p->cid_name, p->hidecallerid ? "" : p->cid_name,
chan->caller.ani ? NULL : p->cid_num); chan->caller.ani.number.valid ? NULL : p->cid_num);
ast_setstate(chan, AST_STATE_RING); ast_setstate(chan, AST_STATE_RING);
/*dahdi_enable_ec(p);*/ /*dahdi_enable_ec(p);*/
if (p->dtmfmode & MGCP_DTMF_HYBRID) { if (p->dtmfmode & MGCP_DTMF_HYBRID) {

View File

@ -7893,7 +7893,8 @@ static void update_name(struct ast_channel *tmp, int port, int c)
static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char *exten, char *callerid, int format, const char *linkedid, int port, int c) static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char *exten, char *callerid, int format, const char *linkedid, int port, int c)
{ {
struct ast_channel *tmp; struct ast_channel *tmp;
char *cid_name = 0, *cid_num = 0; char *cid_name = NULL;
char *cid_num = NULL;
int chan_offset = 0; int chan_offset = 0;
int tmp_port = misdn_cfg_get_next_port(0); int tmp_port = misdn_cfg_get_next_port(0);
int bridging; int bridging;
@ -7938,10 +7939,11 @@ static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char
chan_misdn_log(1, 0, "misdn_new: no exten given.\n"); chan_misdn_log(1, 0, "misdn_new: no exten given.\n");
} }
if (callerid) { if (!ast_strlen_zero(cid_num)) {
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
tmp->caller.ani = ast_strdup(cid_num); tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(cid_num);
} }
if (pipe(chlist->pipe) < 0) { if (pipe(chlist->pipe) < 0) {

View File

@ -807,7 +807,10 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx,
ast_string_field_set(c, language, o->language); ast_string_field_set(c, language, o->language);
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
c->caller.ani = ast_strdup(o->cid_num); if (!ast_strlen_zero(o->cid_num)) {
c->caller.ani.number.valid = 1;
c->caller.ani.number.str = ast_strdup(o->cid_num);
}
if (!ast_strlen_zero(ext)) { if (!ast_strlen_zero(ext)) {
c->dialed.number.str = ast_strdup(ext); c->dialed.number.str = ast_strdup(ext);
} }

View File

@ -888,7 +888,10 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *cntx,
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a NewCallerID event before the NewChannel event */ * generate a NewCallerID event before the NewChannel event */
tmp->caller.ani = ast_strdup(i->cid_num); if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
i->owner = tmp; i->owner = tmp;
ast_module_ref(ast_module_info->self); ast_module_ref(ast_module_info->self);

View File

@ -6524,7 +6524,10 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate an unnecessary NewCallerID event */ * generate an unnecessary NewCallerID event */
tmp->caller.ani = ast_strdup(i->cid_num); if (!ast_strlen_zero(i->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_num);
}
if (!ast_strlen_zero(i->rdnis)) { if (!ast_strlen_zero(i->rdnis)) {
tmp->redirecting.from.number.valid = 1; tmp->redirecting.from.number.valid = 1;
tmp->redirecting.from.number.str = ast_strdup(i->rdnis); tmp->redirecting.from.number.str = ast_strdup(i->rdnis);

View File

@ -3774,7 +3774,7 @@ static void *skinny_newcall(void *data)
ast_set_callerid(c, ast_set_callerid(c,
l->hidecallerid ? "" : l->cid_num, l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name, l->hidecallerid ? "" : l->cid_name,
c->caller.ani ? NULL : l->cid_num); c->caller.ani.number.valid ? NULL : l->cid_num);
#if 1 /* XXX This code is probably not necessary */ #if 1 /* XXX This code is probably not necessary */
ast_party_number_free(&c->connected.id.number); ast_party_number_free(&c->connected.id.number);
ast_party_number_init(&c->connected.id.number); ast_party_number_init(&c->connected.id.number);
@ -4573,7 +4573,10 @@ static struct ast_channel *skinny_new(struct skinny_line *l, int state, const ch
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
tmp->caller.ani = ast_strdup(l->cid_num); if (!ast_strlen_zero(l->cid_num)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(l->cid_num);
}
tmp->priority = 1; tmp->priority = 1;
tmp->adsicpe = AST_ADSI_UNAVAILABLE; tmp->adsicpe = AST_ADSI_UNAVAILABLE;

View File

@ -2201,7 +2201,10 @@ static struct ast_channel *usbradio_new(struct chan_usbradio_pvt *o, char *ext,
ast_string_field_set(c, language, o->language); ast_string_field_set(c, language, o->language);
/* Don't use ast_set_callerid() here because it will /* Don't use ast_set_callerid() here because it will
* generate a needless NewCallerID event */ * generate a needless NewCallerID event */
c->caller.ani = ast_strdup(o->cid_num); if (!ast_strlen_zero(o->cid_num)) {
c->caller.ani.number.valid = 1;
c->caller.ani.number.str = ast_strdup(o->cid_num);
}
if (!ast_strlen_zero(ext)) { if (!ast_strlen_zero(ext)) {
c->dialed.number.str = ast_strdup(ext); c->dialed.number.str = ast_strdup(ext);
} }

View File

@ -788,7 +788,7 @@ static void get_callerid_ast(struct vpb_pvt *p)
ast_shrink_phone_number(number); ast_shrink_phone_number(number);
ast_set_callerid(owner, ast_set_callerid(owner,
number, name, number, name,
owner->caller.ani ? NULL : number); owner->caller.ani.number.valid ? NULL : number);
if (!ast_strlen_zero(name)){ if (!ast_strlen_zero(name)){
snprintf(p->callerid, sizeof(p->callerid), "%s %s", number, name); snprintf(p->callerid, sizeof(p->callerid), "%s %s", number, name);
} else { } else {

View File

@ -3039,10 +3039,12 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
switch (p->whichwink) { switch (p->whichwink) {
case 0: case 0:
ast_debug(1, "ANI2 set to '%d' and ANI is '%s'\n", p->owner->caller.ani2, ast_debug(1, "ANI2 set to '%d' and ANI is '%s'\n", p->owner->caller.ani2,
S_OR(p->owner->caller.ani, "")); S_COR(p->owner->caller.ani.number.valid,
p->owner->caller.ani.number.str, ""));
snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%d%s#", snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%d%s#",
p->owner->caller.ani2, p->owner->caller.ani2,
S_OR(p->owner->caller.ani, "")); S_COR(p->owner->caller.ani.number.valid,
p->owner->caller.ani.number.str, ""));
break; break;
case 1: case 1:
ast_copy_string(p->dop.dialstr, p->finaldial, sizeof(p->dop.dialstr)); ast_copy_string(p->dop.dialstr, p->finaldial, sizeof(p->dop.dialstr));

View File

@ -223,7 +223,12 @@ static void sig_pri_set_caller_id(struct sig_pri_chan *p)
caller.id.subaddress.str = p->cid_subaddr; caller.id.subaddress.str = p->cid_subaddr;
} }
caller.id.tag = p->user_tag; caller.id.tag = p->user_tag;
caller.ani = p->cid_ani;
caller.ani.number.str = p->cid_ani;
//caller.ani.number.plan = p->xxx;
//caller.ani.number.presentation = p->xxx;
caller.ani.number.valid = 1;
caller.ani2 = p->cid_ani2; caller.ani2 = p->cid_ani2;
p->calls->set_callerid(p->chan_pvt, &caller); p->calls->set_callerid(p->chan_pvt, &caller);
} }

View File

@ -140,7 +140,12 @@ static void sig_ss7_set_caller_id(struct sig_ss7_chan *p)
//caller.id.subaddress.odd_even_indicator = 0; //caller.id.subaddress.odd_even_indicator = 0;
caller.id.subaddress.str = p->cid_subaddr; caller.id.subaddress.str = p->cid_subaddr;
} }
caller.ani = p->cid_ani;
caller.ani.number.str = p->cid_ani;
//caller.ani.number.plan = p->xxx;
//caller.ani.number.presentation = p->xxx;
caller.ani.number.valid = 1;
caller.ani2 = p->cid_ani2; caller.ani2 = p->cid_ani2;
p->calls->set_callerid(p->chan_pvt, &caller); p->calls->set_callerid(p->chan_pvt, &caller);
} }

View File

@ -44,6 +44,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
* Do not document the CALLERID(ton) datatype. * Do not document the CALLERID(ton) datatype.
* It is an alias for num-plan. * It is an alias for num-plan.
* *
* Do not document the CALLERID(ANI-subaddr-...) datatype.
* This is not used.
*
* Do not document the CONNECTEDLINE(source) datatype. * Do not document the CONNECTEDLINE(source) datatype.
* It has turned out to not be needed. The source value is really * It has turned out to not be needed. The source value is really
* only useful as a possible tracing aid. * only useful as a possible tracing aid.
@ -93,7 +96,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name = "subaddr-type" /> <enum name = "subaddr-type" />
<enum name = "subaddr-odd" /> <enum name = "subaddr-odd" />
<enum name = "tag" /> <enum name = "tag" />
<enum name = "ANI" /> <enum name = "ANI-all" />
<enum name = "ANI-name" />
<enum name = "ANI-name-valid" />
<enum name = "ANI-name-charset" />
<enum name = "ANI-name-pres" />
<enum name = "ANI-num" />
<enum name = "ANI-num-valid" />
<enum name = "ANI-num-plan" />
<enum name = "ANI-num-pres" />
<enum name = "ANI-tag" />
<enum name = "RDNIS" /> <enum name = "RDNIS" />
<enum name = "DNID" /> <enum name = "DNID" />
<enum name = "dnid-num-plan" /> <enum name = "dnid-num-plan" />
@ -946,9 +958,21 @@ static int callerid_read(struct ast_channel *chan, const char *cmd, char *data,
} }
} else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) { } else if (member.argc == 1 && !strcasecmp("ani2", member.argv[0])) {
snprintf(buf, len, "%d", chan->caller.ani2); snprintf(buf, len, "%d", chan->caller.ani2);
} else if (member.argc == 1 && !strcasecmp("ani", member.argv[0])) { } else if (!strcasecmp("ani", member.argv[0])) {
if (chan->caller.ani) { if (member.argc == 1) {
ast_copy_string(buf, chan->caller.ani, len); /* Setup as if user had given ani-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
status = party_id_read(buf, len, member.argc - 1, member.argv + 1,
&chan->caller.ani);
switch (status) {
case ID_FIELD_VALID:
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
} }
} else { } else {
status = party_id_read(buf, len, member.argc, member.argv, &chan->caller.id); status = party_id_read(buf, len, member.argc, member.argv, &chan->caller.id);
@ -1090,13 +1114,26 @@ static int callerid_write(struct ast_channel *chan, const char *cmd, char *data,
} else { } else {
ast_log(LOG_ERROR, "Unknown callerid ani2 '%s', value unchanged\n", val); ast_log(LOG_ERROR, "Unknown callerid ani2 '%s', value unchanged\n", val);
} }
} else if (member.argc == 1 && !strcasecmp("ani", member.argv[0])) { } else if (!strcasecmp("ani", member.argv[0])) {
ast_party_caller_set_init(&caller, &chan->caller); ast_party_caller_set_init(&caller, &chan->caller);
caller.ani = ast_strdup(value); if (member.argc == 1) {
ast_trim_blanks(caller.ani); /* Setup as if user had given ani-num instead. */
ast_party_caller_set(&chan->caller, &caller, NULL); member.argc = 2;
if (chan->cdr) { member.argv[1] = "num";
ast_cdr_setcid(chan->cdr, chan); }
status = party_id_write(&caller.ani, member.argc - 1, member.argv + 1, value);
switch (status) {
case ID_FIELD_VALID:
ast_party_caller_set(&chan->caller, &caller, NULL);
if (chan->cdr) {
ast_cdr_setcid(chan->cdr, chan);
}
break;
case ID_FIELD_INVALID:
break;
default:
ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
break;
} }
ast_party_caller_free(&caller); ast_party_caller_free(&caller);
} else { } else {

View File

@ -369,10 +369,11 @@ struct ast_party_caller {
struct ast_party_id id; struct ast_party_id id;
/*! /*!
* \brief Automatic Number Identification (ANI) (Malloced) * \brief Automatic Number Identification (ANI)
* \todo BUGBUG This should be made an ast_party_id. * \note The name subcomponent is only likely to be used by SIP.
* \note The subaddress subcomponent is not likely to be used.
*/ */
char *ani; struct ast_party_id ani;
/*! \brief Automatic Number Identification 2 (Info Digits) */ /*! \brief Automatic Number Identification 2 (Info Digits) */
int ani2; int ani2;
@ -385,6 +386,8 @@ struct ast_party_caller {
struct ast_set_party_caller { struct ast_set_party_caller {
/*! What caller id information to set. */ /*! What caller id information to set. */
struct ast_set_party_id id; struct ast_set_party_id id;
/*! What ANI id information to set. */
struct ast_set_party_id ani;
}; };
/*! /*!
@ -399,12 +402,11 @@ struct ast_party_connected_line {
struct ast_party_id id; struct ast_party_id id;
/*! /*!
* \brief Automatic Number Identification (ANI) (Malloced) * \brief Automatic Number Identification (ANI)
* \note Not really part of connected line data but needed to * \note Not really part of connected line data but needed to
* save the corresponding caller id value. * save the corresponding caller id value.
* \todo BUGBUG This should be made an ast_party_id.
*/ */
char *ani; struct ast_party_id ani;
/*! /*!
* \brief Automatic Number Identification 2 (Info Digits) * \brief Automatic Number Identification 2 (Info Digits)
@ -428,6 +430,8 @@ struct ast_party_connected_line {
struct ast_set_party_connected_line { struct ast_set_party_connected_line {
/*! What connected line id information to set. */ /*! What connected line id information to set. */
struct ast_set_party_id id; struct ast_set_party_id id;
/*! What ANI id information to set. */
struct ast_set_party_id ani;
}; };
/*! /*!

View File

@ -853,7 +853,7 @@ static void set_one_cid(struct ast_cdr *cdr, struct ast_channel *c)
} }
/* Grab source from ANI or normal Caller*ID */ /* Grab source from ANI or normal Caller*ID */
num = S_OR(c->caller.ani, num = S_COR(c->caller.ani.number.valid, c->caller.ani.number.str,
S_COR(c->caller.id.number.valid, c->caller.id.number.str, NULL)); S_COR(c->caller.id.number.valid, c->caller.id.number.str, NULL));
ast_callerid_merge(cdr->clid, sizeof(cdr->clid), ast_callerid_merge(cdr->clid, sizeof(cdr->clid),
S_COR(c->caller.id.name.valid, c->caller.id.name.str, NULL), num, ""); S_COR(c->caller.id.name.valid, c->caller.id.name.str, NULL), num, "");

View File

@ -441,7 +441,8 @@ struct ast_channel *ast_cel_fabricate_channel_from_event(const struct ast_event
tchan->caller.id.name.str = ast_strdup(record.caller_id_name); tchan->caller.id.name.str = ast_strdup(record.caller_id_name);
tchan->caller.id.number.valid = 1; tchan->caller.id.number.valid = 1;
tchan->caller.id.number.str = ast_strdup(record.caller_id_num); tchan->caller.id.number.str = ast_strdup(record.caller_id_num);
tchan->caller.ani = ast_strdup(record.caller_id_ani); tchan->caller.ani.number.valid = 1;
tchan->caller.ani.number.str = ast_strdup(record.caller_id_ani);
tchan->redirecting.from.number.valid = 1; tchan->redirecting.from.number.valid = 1;
tchan->redirecting.from.number.str = ast_strdup(record.caller_id_rdnis); tchan->redirecting.from.number.str = ast_strdup(record.caller_id_rdnis);
tchan->dialed.number.str = ast_strdup(record.caller_id_dnid); tchan->dialed.number.str = ast_strdup(record.caller_id_dnid);
@ -538,7 +539,7 @@ int ast_cel_report_event(struct ast_channel *chan, enum ast_cel_event_type event
AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_PLTYPE_STR,
S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""), S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""),
AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_PLTYPE_STR,
S_OR(chan->caller.ani, ""), S_COR(chan->caller.ani.number.valid, chan->caller.ani.number.str, ""),
AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_PLTYPE_STR,
S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, ""), S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.str, ""),
AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_PLTYPE_STR,

View File

@ -2136,7 +2136,7 @@ void ast_party_dialed_free(struct ast_party_dialed *doomed)
void ast_party_caller_init(struct ast_party_caller *init) void ast_party_caller_init(struct ast_party_caller *init)
{ {
ast_party_id_init(&init->id); ast_party_id_init(&init->id);
init->ani = NULL; ast_party_id_init(&init->ani);
init->ani2 = 0; init->ani2 = 0;
} }
@ -2148,44 +2148,34 @@ void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party
} }
ast_party_id_copy(&dest->id, &src->id); ast_party_id_copy(&dest->id, &src->id);
ast_party_id_copy(&dest->ani, &src->ani);
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
} }
void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide) void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
{ {
ast_party_id_set_init(&init->id, &guide->id); ast_party_id_set_init(&init->id, &guide->id);
init->ani = NULL; ast_party_id_set_init(&init->ani, &guide->ani);
init->ani2 = guide->ani2; init->ani2 = guide->ani2;
} }
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update) void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
{ {
ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL); ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
if (src->ani && src->ani != dest->ani) {
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
}
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
} }
void ast_party_caller_free(struct ast_party_caller *doomed) void ast_party_caller_free(struct ast_party_caller *doomed)
{ {
ast_party_id_free(&doomed->id); ast_party_id_free(&doomed->id);
ast_party_id_free(&doomed->ani);
ast_free(doomed->ani);
doomed->ani = NULL;
} }
void ast_party_connected_line_init(struct ast_party_connected_line *init) void ast_party_connected_line_init(struct ast_party_connected_line *init)
{ {
ast_party_id_init(&init->id); ast_party_id_init(&init->id);
init->ani = NULL; ast_party_id_init(&init->ani);
init->ani2 = 0; init->ani2 = 0;
init->source = AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN; init->source = AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN;
} }
@ -2198,10 +2188,7 @@ void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const
} }
ast_party_id_copy(&dest->id, &src->id); ast_party_id_copy(&dest->id, &src->id);
ast_party_id_copy(&dest->ani, &src->ani);
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
dest->source = src->source; dest->source = src->source;
} }
@ -2209,7 +2196,7 @@ void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide) void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
{ {
ast_party_id_set_init(&init->id, &guide->id); ast_party_id_set_init(&init->id, &guide->id);
init->ani = NULL; ast_party_id_set_init(&init->ani, &guide->ani);
init->ani2 = guide->ani2; init->ani2 = guide->ani2;
init->source = guide->source; init->source = guide->source;
} }
@ -2217,12 +2204,7 @@ void ast_party_connected_line_set_init(struct ast_party_connected_line *init, co
void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update) void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
{ {
ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL); ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
if (src->ani && src->ani != dest->ani) {
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
}
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
dest->source = src->source; dest->source = src->source;
} }
@ -2238,9 +2220,7 @@ void ast_party_connected_line_collect_caller(struct ast_party_connected_line *co
void ast_party_connected_line_free(struct ast_party_connected_line *doomed) void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
{ {
ast_party_id_free(&doomed->id); ast_party_id_free(&doomed->id);
ast_party_id_free(&doomed->ani);
ast_free(doomed->ani);
doomed->ani = NULL;
} }
void ast_party_redirecting_init(struct ast_party_redirecting *init) void ast_party_redirecting_init(struct ast_party_redirecting *init)
@ -6205,8 +6185,9 @@ void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char
chan->caller.id.name.str = ast_strdup(cid_name); chan->caller.id.name.str = ast_strdup(cid_name);
} }
if (cid_ani) { if (cid_ani) {
ast_free(chan->caller.ani); chan->caller.ani.number.valid = 1;
chan->caller.ani = ast_strdup(cid_ani); ast_free(chan->caller.ani.number.str);
chan->caller.ani.number.str = ast_strdup(cid_ani);
} }
report_new_callerid(chan); report_new_callerid(chan);
@ -7497,19 +7478,14 @@ int ast_say_digits_full(struct ast_channel *chan, int num,
void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src) void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src)
{ {
ast_party_id_copy(&dest->id, &src->id); ast_party_id_copy(&dest->id, &src->id);
ast_party_id_copy(&dest->ani, &src->ani);
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
} }
void ast_connected_line_copy_to_caller(struct ast_party_caller *dest, const struct ast_party_connected_line *src) void ast_connected_line_copy_to_caller(struct ast_party_caller *dest, const struct ast_party_connected_line *src)
{ {
ast_party_id_copy(&dest->id, &src->id); ast_party_id_copy(&dest->id, &src->id);
ast_party_id_copy(&dest->ani, &src->ani);
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
dest->ani2 = src->ani2; dest->ani2 = src->ani2;
} }

View File

@ -443,8 +443,8 @@ static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *le
} }
break; break;
case ASTCHANCIDANI: case ASTCHANCIDANI:
if (chan->caller.ani) { if (chan->caller.ani.number.valid && chan->caller.ani.number.str) {
strncpy(string_ret, chan->caller.ani, sizeof(string_ret)); strncpy(string_ret, chan->caller.ani.number.str, sizeof(string_ret));
string_ret[sizeof(string_ret) - 1] = '\0'; string_ret[sizeof(string_ret) - 1] = '\0';
*var_len = strlen(string_ret); *var_len = strlen(string_ret);
ret = (u_char *)string_ret; ret = (u_char *)string_ret;