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,
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)"),
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,
S_COR(caller->id.name.valid, caller->id.name.str, ""),
sizeof(p->cid_name));
if (caller->id.subaddress.valid) {
ast_copy_string(p->cid_subaddr, S_OR(caller->id.subaddress.str, ""),
sizeof(p->cid_subaddr));
} else {
p->cid_subaddr[0] = '\0';
}
ast_copy_string(p->cid_subaddr,
S_COR(caller->id.subaddress.valid, caller->id.subaddress.str, ""),
sizeof(p->cid_subaddr));
p->cid_ton = caller->id.number.plan;
p->callingpres = ast_party_id_presentation(&caller->id);
if (caller->id.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;
}
#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
@ -8187,10 +8186,12 @@ winkflashdone:
switch (p->whichwink) {
case 0:
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#",
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;
case 1:
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
* generate a needless NewCallerID event */
#if defined(HAVE_PRI) || defined(HAVE_SS7)
if (!ast_strlen_zero(i->cid_ani))
tmp->caller.ani = ast_strdup(i->cid_ani);
else
tmp->caller.ani = ast_strdup(i->cid_num);
if (!ast_strlen_zero(i->cid_ani)) {
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->cid_ani);
} 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
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) */
tmp->caller.id.name.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
* 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) {
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)
iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
if (ast_test_flag64(iaxs[callno], IAX_SENDANI) && c->connected.ani)
iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->connected.ani);
if (ast_test_flag64(iaxs[callno], IAX_SENDANI)
&& 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))
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
* generate a NewCallerID event before the NewChannel event */
if (!ast_strlen_zero(i->ani)) {
tmp->caller.ani = ast_strdup(i->ani);
} else {
tmp->caller.ani = ast_strdup(i->cid_num);
tmp->caller.ani.number.valid = 1;
tmp->caller.ani.number.str = ast_strdup(i->ani);
} 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->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));
/* Don't use ast_set_callerid() here because it will
* 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")) {
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
* 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) {
tmp->adsicpe = AST_ADSI_UNAVAILABLE;
@ -3002,7 +3005,7 @@ static void *mgcp_ss(void *data)
ast_set_callerid(chan,
p->hidecallerid ? "" : p->cid_num,
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);
/*dahdi_enable_ec(p);*/
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)
{
struct ast_channel *tmp;
char *cid_name = 0, *cid_num = 0;
char *cid_name = NULL;
char *cid_num = NULL;
int chan_offset = 0;
int tmp_port = misdn_cfg_get_next_port(0);
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");
}
if (callerid) {
if (!ast_strlen_zero(cid_num)) {
/* Don't use ast_set_callerid() here because it will
* 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) {

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);
/* Don't use ast_set_callerid() here because it will
* 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)) {
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
* 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;
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
* 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)) {
tmp->redirecting.from.number.valid = 1;
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,
l->hidecallerid ? "" : l->cid_num,
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 */
ast_party_number_free(&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
* 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->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);
/* Don't use ast_set_callerid() here because it will
* 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)) {
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_set_callerid(owner,
number, name,
owner->caller.ani ? NULL : number);
owner->caller.ani.number.valid ? NULL : number);
if (!ast_strlen_zero(name)){
snprintf(p->callerid, sizeof(p->callerid), "%s %s", number, name);
} else {

View File

@ -3039,10 +3039,12 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_
switch (p->whichwink) {
case 0:
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#",
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;
case 1:
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.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;
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.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;
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.
* 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.
* It has turned out to not be needed. The source value is really
* only useful as a possible tracing aid.
@ -93,7 +96,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name = "subaddr-type" />
<enum name = "subaddr-odd" />
<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 = "DNID" />
<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])) {
snprintf(buf, len, "%d", chan->caller.ani2);
} else if (member.argc == 1 && !strcasecmp("ani", member.argv[0])) {
if (chan->caller.ani) {
ast_copy_string(buf, chan->caller.ani, len);
} else if (!strcasecmp("ani", member.argv[0])) {
if (member.argc == 1) {
/* 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 {
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 {
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);
caller.ani = ast_strdup(value);
ast_trim_blanks(caller.ani);
ast_party_caller_set(&chan->caller, &caller, NULL);
if (chan->cdr) {
ast_cdr_setcid(chan->cdr, chan);
if (member.argc == 1) {
/* Setup as if user had given ani-num instead. */
member.argc = 2;
member.argv[1] = "num";
}
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);
} else {

View File

@ -369,10 +369,11 @@ struct ast_party_caller {
struct ast_party_id id;
/*!
* \brief Automatic Number Identification (ANI) (Malloced)
* \todo BUGBUG This should be made an ast_party_id.
* \brief Automatic Number Identification (ANI)
* \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) */
int ani2;
@ -385,6 +386,8 @@ struct ast_party_caller {
struct ast_set_party_caller {
/*! What caller id information to set. */
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;
/*!
* \brief Automatic Number Identification (ANI) (Malloced)
* \brief Automatic Number Identification (ANI)
* \note Not really part of connected line data but needed to
* 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)
@ -428,6 +430,8 @@ struct ast_party_connected_line {
struct ast_set_party_connected_line {
/*! What connected line id information to set. */
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 */
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));
ast_callerid_merge(cdr->clid, sizeof(cdr->clid),
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.number.valid = 1;
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.str = ast_strdup(record.caller_id_rdnis);
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,
S_COR(chan->caller.id.number.valid, chan->caller.id.number.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,
S_COR(chan->redirecting.from.number.valid, chan->redirecting.from.number.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)
{
ast_party_id_init(&init->id);
init->ani = NULL;
ast_party_id_init(&init->ani);
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_free(dest->ani);
dest->ani = ast_strdup(src->ani);
ast_party_id_copy(&dest->ani, &src->ani);
dest->ani2 = src->ani2;
}
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);
init->ani = NULL;
ast_party_id_set_init(&init->ani, &guide->ani);
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)
{
ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
if (src->ani && src->ani != dest->ani) {
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
}
ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
dest->ani2 = src->ani2;
}
void ast_party_caller_free(struct ast_party_caller *doomed)
{
ast_party_id_free(&doomed->id);
ast_free(doomed->ani);
doomed->ani = NULL;
ast_party_id_free(&doomed->ani);
}
void ast_party_connected_line_init(struct ast_party_connected_line *init)
{
ast_party_id_init(&init->id);
init->ani = NULL;
ast_party_id_init(&init->ani);
init->ani2 = 0;
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_free(dest->ani);
dest->ani = ast_strdup(src->ani);
ast_party_id_copy(&dest->ani, &src->ani);
dest->ani2 = src->ani2;
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)
{
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->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)
{
ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
if (src->ani && src->ani != dest->ani) {
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
}
ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
dest->ani2 = src->ani2;
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)
{
ast_party_id_free(&doomed->id);
ast_free(doomed->ani);
doomed->ani = NULL;
ast_party_id_free(&doomed->ani);
}
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);
}
if (cid_ani) {
ast_free(chan->caller.ani);
chan->caller.ani = ast_strdup(cid_ani);
chan->caller.ani.number.valid = 1;
ast_free(chan->caller.ani.number.str);
chan->caller.ani.number.str = ast_strdup(cid_ani);
}
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)
{
ast_party_id_copy(&dest->id, &src->id);
ast_free(dest->ani);
dest->ani = ast_strdup(src->ani);
ast_party_id_copy(&dest->ani, &src->ani);
dest->ani2 = src->ani2;
}
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_free(dest->ani);
dest->ani = ast_strdup(src->ani);
ast_party_id_copy(&dest->ani, &src->ani);
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;
case ASTCHANCIDANI:
if (chan->caller.ani) {
strncpy(string_ret, chan->caller.ani, sizeof(string_ret));
if (chan->caller.ani.number.valid && chan->caller.ani.number.str) {
strncpy(string_ret, chan->caller.ani.number.str, sizeof(string_ret));
string_ret[sizeof(string_ret) - 1] = '\0';
*var_len = strlen(string_ret);
ret = (u_char *)string_ret;