From d93fa33a75ef977b9425f11e4d9c69719fea0a9f Mon Sep 17 00:00:00 2001 From: rmudgett Date: Wed, 14 Jul 2010 16:58:03 +0000 Subject: [PATCH] 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 --- apps/app_amd.c | 2 +- channels/chan_dahdi.c | 35 +++++++++++++---------- channels/chan_h323.c | 5 +++- channels/chan_iax2.c | 15 ++++++---- channels/chan_jingle.c | 5 +++- channels/chan_mgcp.c | 7 +++-- channels/chan_misdn.c | 8 ++++-- channels/chan_oss.c | 5 +++- channels/chan_phone.c | 5 +++- channels/chan_sip.c | 5 +++- channels/chan_skinny.c | 7 +++-- channels/chan_usbradio.c | 5 +++- channels/chan_vpb.cc | 2 +- channels/sig_analog.c | 6 ++-- channels/sig_pri.c | 7 ++++- channels/sig_ss7.c | 7 ++++- funcs/func_callerid.c | 57 +++++++++++++++++++++++++++++++------- include/asterisk/channel.h | 16 +++++++---- main/cdr.c | 2 +- main/cel.c | 5 ++-- main/channel.c | 54 ++++++++++-------------------------- res/snmp/agent.c | 4 +-- 22 files changed, 166 insertions(+), 98 deletions(-) diff --git a/apps/app_amd.c b/apps/app_amd.c index f4eb78470..b89a93212 100644 --- a/apps/app_amd.c +++ b/apps/app_amd.c @@ -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)); diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index e807b957a..8742477a4 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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; diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 1866ce038..74734a589 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -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; diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 97752f63a..72e6b666c 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -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; diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c index d57644cb1..bdf01203b 100644 --- a/channels/chan_jingle.c +++ b/channels/chan_jingle.c @@ -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); } diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index b0bd1cc97..2f4aa4aea 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -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) { diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 7e1f14af7..302c8541c 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -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) { diff --git a/channels/chan_oss.c b/channels/chan_oss.c index b2776850d..9a60fa8ce 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -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); } diff --git a/channels/chan_phone.c b/channels/chan_phone.c index 18eaf8fa1..48da10fd6 100644 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -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); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cb981dc86..e68fc7333 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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); diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 3a99fbbcd..31f70ec46 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -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; diff --git a/channels/chan_usbradio.c b/channels/chan_usbradio.c index f64a2cb10..10449be91 100644 --- a/channels/chan_usbradio.c +++ b/channels/chan_usbradio.c @@ -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); } diff --git a/channels/chan_vpb.cc b/channels/chan_vpb.cc index 9914c59c3..6a268bdb3 100644 --- a/channels/chan_vpb.cc +++ b/channels/chan_vpb.cc @@ -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 { diff --git a/channels/sig_analog.c b/channels/sig_analog.c index feb0d5fdb..6054458cf 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -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)); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 6b6a25e6d..26e6e3eda 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -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); } diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c index 7325b874b..7e1f76aa4 100644 --- a/channels/sig_ss7.c +++ b/channels/sig_ss7.c @@ -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); } diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 98d58d07b..a653d8660 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -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$") - + + + + + + + + + + @@ -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 { diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 46d6c7476..e8bb9d535 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -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; }; /*! diff --git a/main/cdr.c b/main/cdr.c index 9dca74ff3..a6096976d 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -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, ""); diff --git a/main/cel.c b/main/cel.c index 52c62f6b8..0af890bde 100644 --- a/main/cel.c +++ b/main/cel.c @@ -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, diff --git a/main/channel.c b/main/channel.c index 51cbd553b..65a4b7810 100644 --- a/main/channel.c +++ b/main/channel.c @@ -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; } diff --git a/res/snmp/agent.c b/res/snmp/agent.c index c18c3e5af..bd84c1b6b 100644 --- a/res/snmp/agent.c +++ b/res/snmp/agent.c @@ -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;