aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_amd.c2
-rw-r--r--channels/chan_dahdi.c35
-rw-r--r--channels/chan_h323.c5
-rw-r--r--channels/chan_iax2.c15
-rw-r--r--channels/chan_jingle.c5
-rw-r--r--channels/chan_mgcp.c7
-rw-r--r--channels/chan_misdn.c8
-rw-r--r--channels/chan_oss.c5
-rw-r--r--channels/chan_phone.c5
-rw-r--r--channels/chan_sip.c5
-rw-r--r--channels/chan_skinny.c7
-rw-r--r--channels/chan_usbradio.c5
-rw-r--r--channels/chan_vpb.cc2
-rw-r--r--channels/sig_analog.c6
-rw-r--r--channels/sig_pri.c7
-rw-r--r--channels/sig_ss7.c7
-rw-r--r--funcs/func_callerid.c57
-rw-r--r--include/asterisk/channel.h16
-rw-r--r--main/cdr.c2
-rw-r--r--main/cel.c5
-rw-r--r--main/channel.c54
-rw-r--r--res/snmp/agent.c4
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$")
<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 {
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;