31 #include "asterisk/res_pjsip.h"
32 #include "asterisk/res_pjsip_session.h"
49 static int set_id_from_oli(pjsip_rx_data *rdata,
int *ani2)
53 pjsip_param *oli1, *oli2, *oli3;
55 static const pj_str_t oli_str1 = {
"isup-oli", 8 };
56 static const pj_str_t oli_str2 = {
"ss7-oli", 7 };
57 static const pj_str_t oli_str3 = {
"oli", 3 };
59 pjsip_fromto_hdr *from = pjsip_msg_find_hdr(rdata->msg_info.msg,
60 PJSIP_H_FROM, rdata->msg_info.msg->hdr.next);
66 if ((oli1 = pjsip_param_find(&from->other_param, &oli_str1))) {
67 ast_copy_pj_str(oli, &oli1->value,
sizeof(oli));
68 }
else if ((oli2 = pjsip_param_find(&from->other_param, &oli_str2))) {
69 ast_copy_pj_str(oli, &oli2->value,
sizeof(oli));
70 }
else if ((oli3 = pjsip_param_find(&from->other_param, &oli_str3))) {
71 ast_copy_pj_str(oli, &oli3->value,
sizeof(oli));
123 if (ast_strlen_zero(session->
id.
name.
str) ||
154 caller.id = connected.id;
155 caller.ani = connected.id;
156 caller.ani2 = ast_channel_caller(session->
channel)->
ani2;
174 static void update_incoming_connected_line(
struct ast_sip_session *session, pjsip_rx_data *rdata)
184 if (!ast_sip_set_id_connected_line(rdata, &
id)) {
185 if (should_queue_connected_line_update(session, &
id)) {
186 queue_connected_line_update(session, &
id);
204 static int caller_id_incoming_request(
struct ast_sip_session *session, pjsip_rx_data *rdata)
214 session->
ani2 = set_id_from_oli(rdata, &ani2) ? 0 : ani2;
220 update_incoming_connected_line(session, rdata);
234 static void caller_id_incoming_response(
struct ast_sip_session *session, pjsip_rx_data *rdata)
240 update_incoming_connected_line(session, rdata);
252 static pjsip_fromto_hdr *create_new_id_hdr(
const pj_str_t *hdr_name, pjsip_fromto_hdr *base, pjsip_tx_data *tdata,
const struct ast_party_id *
id)
254 pjsip_fromto_hdr *id_hdr;
255 pjsip_name_addr *id_name_addr;
256 pjsip_sip_uri *id_uri;
258 id_hdr = pjsip_from_hdr_create(tdata->pool);
259 id_hdr->type = PJSIP_H_OTHER;
260 id_hdr->sname = id_hdr->name = *hdr_name;
262 id_name_addr = pjsip_uri_clone(tdata->pool, base->uri);
263 id_uri = pjsip_uri_get_uri(id_name_addr->uri);
266 int name_buf_len = strlen(id->
name.
str) * 2 + 1;
270 pj_strdup2(tdata->pool, &id_name_addr->display, name_buf);
276 pj_strdup2(tdata->pool, &id_name_addr->display, NULL);
280 pj_strdup2(tdata->pool, &id_uri->user, id->
number.
str);
283 pj_strdup2(tdata->pool, &id_uri->user, NULL);
286 id_hdr->uri = (pjsip_uri *) id_name_addr;
302 static void add_privacy_header(pjsip_tx_data *tdata,
const struct ast_party_id *
id)
304 static const pj_str_t pj_privacy_name = {
"Privacy", 7 };
305 static const pj_str_t pj_privacy_value = {
"id", 2 };
306 pjsip_hdr *old_privacy;
308 old_privacy = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_privacy_name, NULL);
312 pj_list_erase(old_privacy);
314 }
else if (!old_privacy) {
315 pjsip_generic_string_hdr *privacy_hdr = pjsip_generic_string_hdr_create(
316 tdata->pool, &pj_privacy_name, &pj_privacy_value);
317 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)privacy_hdr);
330 static const pj_str_t pj_pai_name = {
"P-Asserted-Identity", 19 };
331 pjsip_fromto_hdr *base;
332 pjsip_fromto_hdr *pai_hdr;
333 pjsip_fromto_hdr *old_pai;
338 old_pai = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_pai_name, NULL);
349 if (old_pai->type == PJSIP_H_OTHER) {
350 pj_list_erase(old_pai);
352 ast_sip_modify_id_header(tdata->pool, old_pai,
id);
353 add_privacy_header(tdata,
id);
358 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
361 base = PJSIP_MSG_TO_HDR(tdata->msg);
364 pai_hdr = create_new_id_hdr(&pj_pai_name, base, tdata,
id);
368 add_privacy_header(tdata,
id);
370 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr);
381 static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr,
const struct ast_sip_session *session)
383 static const pj_str_t party_str = {
"party", 5 };
384 static const pj_str_t calling_str = {
"calling", 7 };
385 static const pj_str_t called_str = {
"called", 6 };
389 party = pjsip_param_find(&hdr->other_param, &party_str);
394 party = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
395 party->name = party_str;
396 party->value = (session->
inv_session->role == PJSIP_ROLE_UAC) ? calling_str : called_str;
397 pj_list_insert_before(&hdr->other_param, party);
412 static void add_privacy_params(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr,
const struct ast_party_id *
id)
414 static const pj_str_t privacy_str = {
"privacy", 7 };
415 static const pj_str_t screen_str = {
"screen", 6 };
416 static const pj_str_t privacy_full_str = {
"full", 4 };
417 static const pj_str_t privacy_off_str = {
"off", 3 };
418 static const pj_str_t screen_yes_str = {
"yes", 3 };
419 static const pj_str_t screen_no_str = {
"no", 2 };
420 pjsip_param *old_privacy;
421 pjsip_param *old_screen;
422 pjsip_param *privacy;
426 old_privacy = pjsip_param_find(&hdr->other_param, &privacy_str);
427 old_screen = pjsip_param_find(&hdr->other_param, &screen_str);
430 privacy = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
431 privacy->name = privacy_str;
432 pj_list_insert_before(&hdr->other_param, privacy);
434 privacy = old_privacy;
438 screen = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
439 screen->name = screen_str;
440 pj_list_insert_before(&hdr->other_param, screen);
446 if ((presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED) {
447 privacy->value = privacy_off_str;
449 privacy->value = privacy_full_str;
451 if ((presentation & AST_PRES_NUMBER_TYPE) == AST_PRES_USER_NUMBER_PASSED_SCREEN) {
452 screen->value = screen_yes_str;
454 screen->value = screen_no_str;
467 static const pj_str_t pj_rpid_name = {
"Remote-Party-ID", 15 };
468 pjsip_fromto_hdr *base;
469 pjsip_fromto_hdr *rpid_hdr;
470 pjsip_fromto_hdr *old_rpid;
475 old_rpid = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_rpid_name, NULL);
486 if (old_rpid->type == PJSIP_H_OTHER) {
487 pj_list_erase(old_rpid);
489 ast_sip_modify_id_header(tdata->pool, old_rpid,
id);
490 add_party_param(tdata, old_rpid, session);
491 add_privacy_params(tdata, old_rpid,
id);
496 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
499 base = PJSIP_MSG_TO_HDR(tdata->msg);
502 rpid_hdr = create_new_id_hdr(&pj_rpid_name, base, tdata,
id);
506 add_party_param(tdata, rpid_hdr, session);
507 add_privacy_params(tdata, rpid_hdr,
id);
508 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)rpid_hdr);
524 if (!ast_sip_can_present_connected_id(session,
id)) {
528 add_pai_header(session, tdata,
id);
531 add_rpid_header(session, tdata,
id);
546 static void caller_id_outgoing_request(
struct ast_sip_session *session, pjsip_tx_data *tdata)
556 ast_channel_lock(session->
channel);
557 effective_id = ast_channel_connected_effective_id(session->
channel);
559 ast_channel_unlock(session->
channel);
561 add_id_headers(session, tdata, &connected_id);
574 static void caller_id_outgoing_response(
struct ast_sip_session *session, pjsip_tx_data *tdata)
582 && session->
inv_session->state >= PJSIP_INV_STATE_EARLY)) {
588 ast_channel_lock(session->
channel);
589 effective_id = ast_channel_connected_effective_id(session->
channel);
591 ast_channel_unlock(session->
channel);
593 add_id_headers(session, tdata, &connected_id);
598 .
method =
"INVITE,UPDATE",
599 .priority = AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL - 1000,
600 .incoming_request = caller_id_incoming_request,
601 .incoming_response = caller_id_incoming_response,
602 .outgoing_request = caller_id_outgoing_request,
603 .outgoing_response = caller_id_outgoing_response,
606 static int load_module(
void)
609 ast_sip_session_register_supplement(&caller_id_supplement);
613 static int unload_module(
void)
615 ast_sip_session_unregister_supplement(&caller_id_supplement);
619 AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER,
"PJSIP Caller ID Support",
620 .support_level = AST_MODULE_SUPPORT_CORE,
622 .unload = unload_module,
624 .requires =
"res_pjsip,res_pjsip_session",
Information needed to identify an endpoint in a call.
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
struct ast_sip_endpoint * endpoint
char * str
Subscriber phone number (Malloced)
Asterisk main include file. File version handling, generic pbx functions.
void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
Set the caller id information in the Asterisk channel and generate an AMI event if the caller id name...
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
struct ast_party_name name
Subscriber name.
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
char * str
Subscriber name (Malloced)
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
struct pjsip_inv_session * inv_session
A structure describing a SIP session.
struct ast_party_id id
Caller party ID.
void ast_channel_queue_connected_line_update(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Queue a connected line update frame on a channel.
General Asterisk PBX channel definitions.
Caller Party information.
Conversion utility functions.
struct ast_channel * channel
unsigned int send_connected_line
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
struct ast_sip_endpoint_id_configuration id
int ast_str_to_int(const char *str, int *res)
Convert the given string to a signed integer.
#define ast_module_shutdown_ref(mod)
Prevent unload of the module before shutdown.
int ani2
Automatic Number Identification 2 (Info Digits)
Connected Line/Party information.
unsigned int trust_inbound
char * ast_escape_quoted(const char *string, char *outbuf, int buflen)
Escape characters found in a quoted string.
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
A supplement to SIP message processing.
char * tag
User-set "tag".
unsigned int trust_connected_line
unsigned char valid
TRUE if the name information is valid/present.
pjsip_fromto_hdr * saved_from_hdr
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
unsigned char valid
TRUE if the number information is valid/present.
struct ast_party_number number
Subscriber phone number.