Asterisk - The Open Source Telephony Project GIT-master-a63eec2
Loading...
Searching...
No Matches
Functions | Variables
res_pjsip_caller_id.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include <pjsip_ua.h>
#include "asterisk/res_pjsip.h"
#include "asterisk/res_pjsip_session.h"
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/callerid.h"
#include "asterisk/conversions.h"
Include dependency graph for res_pjsip_caller_id.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static void add_id_headers (const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
 
static void add_pai_header (const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
 
static void add_party_param (pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session)
 
static void add_privacy_header (pjsip_tx_data *tdata, const struct ast_party_id *id)
 
static void add_privacy_params (pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_party_id *id)
 
static void add_rpid_header (const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int caller_id_incoming_request (struct ast_sip_session *session, pjsip_rx_data *rdata)
 
static void caller_id_incoming_response (struct ast_sip_session *session, pjsip_rx_data *rdata)
 
static void caller_id_outgoing_request (struct ast_sip_session *session, pjsip_tx_data *tdata)
 
static void caller_id_outgoing_response (struct ast_sip_session *session, pjsip_tx_data *tdata)
 
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)
 
static int extract_oli (const pjsip_param *param_list, char *buf, size_t len)
 
static int load_module (void)
 
static void queue_connected_line_update (struct ast_sip_session *session, const struct ast_party_id *id)
 
static int set_id_from_oli (pjsip_rx_data *rdata, int *ani2)
 
static int should_queue_connected_line_update (const struct ast_sip_session *session, const struct ast_party_id *id)
 
static int unload_module (void)
 
static void update_incoming_connected_line (struct ast_sip_session *session, pjsip_rx_data *rdata)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Caller ID Support" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_pjsip_session", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_sip_session_supplement caller_id_supplement
 

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 639 of file res_pjsip_caller_id.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 639 of file res_pjsip_caller_id.c.

◆ add_id_headers()

static void add_id_headers ( const struct ast_sip_session session,
pjsip_tx_data *  tdata,
const struct ast_party_id id 
)
static

Definition at line 536 of file res_pjsip_caller_id.c.

537{
539 return;
540 }
541 if (session->endpoint->id.send_pai) {
542 add_pai_header(session, tdata, id);
543 }
544 if (session->endpoint->id.send_rpid) {
545 add_rpid_header(session, tdata, id);
546 }
547}
static struct ast_mansession session
static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
static void add_pai_header(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
int ast_sip_can_present_connected_id(const struct ast_sip_session *session, const struct ast_party_id *id)
Determines if the Connected Line info can be presented for this session.

References add_pai_header(), add_rpid_header(), ast_sip_can_present_connected_id(), and session.

Referenced by caller_id_outgoing_request(), and caller_id_outgoing_response().

◆ add_pai_header()

static void add_pai_header ( const struct ast_sip_session session,
pjsip_tx_data *  tdata,
const struct ast_party_id id 
)
static

Definition at line 342 of file res_pjsip_caller_id.c.

343{
344 static const pj_str_t pj_pai_name = { "P-Asserted-Identity", 19 };
345 pjsip_fromto_hdr *base;
346 pjsip_fromto_hdr *pai_hdr;
347 pjsip_fromto_hdr *old_pai;
348
349 /* Since inv_session reuses responses, we have to make sure there's not already
350 * a P-Asserted-Identity present. If there is, we just modify the old one.
351 */
352 old_pai = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_pai_name, NULL);
353 if (old_pai) {
354 /* If type is OTHER, then the existing header was most likely
355 * added by the PJSIP_HEADER dial plan function as a simple
356 * name/value pair. We can't pass this to modify_id_header because
357 * there are no virtual functions to get the uri. We could parse
358 * it into a pjsip_fromto_hdr but it isn't worth it since
359 * modify_id_header is just going to overwrite the name and number
360 * anyway. We'll just remove it from the header list instead
361 * and create a new one.
362 */
363 if (old_pai->type == PJSIP_H_OTHER) {
364 pj_list_erase(old_pai);
365 } else {
366 ast_sip_modify_id_header(tdata->pool, old_pai, id);
367 add_privacy_header(tdata, id);
368 return;
369 }
370 }
371
372 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
373 base = session->saved_from_hdr ? session->saved_from_hdr : PJSIP_MSG_FROM_HDR(tdata->msg);
374 } else {
375 base = PJSIP_MSG_TO_HDR(tdata->msg);
376 }
377
378 pai_hdr = create_new_id_hdr(&pj_pai_name, base, tdata, id);
379 if (!pai_hdr) {
380 return;
381 }
382 add_privacy_header(tdata, id);
383
384 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr);
385}
void ast_sip_modify_id_header(pj_pool_t *pool, pjsip_fromto_hdr *id_hdr, const struct ast_party_id *id)
Set name and number information on an identity header.
Definition res_pjsip.c:2850
static void add_privacy_header(pjsip_tx_data *tdata, const struct ast_party_id *id)
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)
#define NULL
Definition resample.c:96

References add_privacy_header(), ast_sip_modify_id_header(), create_new_id_hdr(), NULL, and session.

Referenced by add_id_headers().

◆ add_party_param()

static void add_party_param ( pjsip_tx_data *  tdata,
pjsip_fromto_hdr *  hdr,
const struct ast_sip_session session 
)
static

Definition at line 395 of file res_pjsip_caller_id.c.

396{
397 static const pj_str_t party_str = { "party", 5 };
398 static const pj_str_t calling_str = { "calling", 7 };
399 static const pj_str_t called_str = { "called", 6 };
400 pjsip_param *party;
401
402 /* The party value can't change throughout the lifetime, so it is set only once */
403 party = pjsip_param_find(&hdr->other_param, &party_str);
404 if (party) {
405 return;
406 }
407
408 party = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
409 party->name = party_str;
410 party->value = (session->inv_session->role == PJSIP_ROLE_UAC) ? calling_str : called_str;
411 pj_list_insert_before(&hdr->other_param, party);
412}

References session.

Referenced by add_rpid_header().

◆ add_privacy_header()

static void add_privacy_header ( pjsip_tx_data *  tdata,
const struct ast_party_id id 
)
static

Definition at line 316 of file res_pjsip_caller_id.c.

317{
318 static const pj_str_t pj_privacy_name = { "Privacy", 7 };
319 static const pj_str_t pj_privacy_value = { "id", 2 };
320 pjsip_hdr *old_privacy;
321
322 old_privacy = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_privacy_name, NULL);
323
325 if (old_privacy) {
326 pj_list_erase(old_privacy);
327 }
328 } else if (!old_privacy) {
329 pjsip_generic_string_hdr *privacy_hdr = pjsip_generic_string_hdr_create(
330 tdata->pool, &pj_privacy_name, &pj_privacy_value);
331 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)privacy_hdr);
332 }
333}
#define AST_PRES_ALLOWED
Definition callerid.h:432
#define AST_PRES_RESTRICTION
Definition callerid.h:431
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition channel.c:1789

References ast_party_id_presentation(), AST_PRES_ALLOWED, AST_PRES_RESTRICTION, and NULL.

Referenced by add_pai_header().

◆ add_privacy_params()

static void add_privacy_params ( pjsip_tx_data *  tdata,
pjsip_fromto_hdr *  hdr,
const struct ast_party_id id 
)
static

Definition at line 426 of file res_pjsip_caller_id.c.

427{
428 static const pj_str_t privacy_str = { "privacy", 7 };
429 static const pj_str_t screen_str = { "screen", 6 };
430 static const pj_str_t privacy_full_str = { "full", 4 };
431 static const pj_str_t privacy_off_str = { "off", 3 };
432 static const pj_str_t screen_yes_str = { "yes", 3 };
433 static const pj_str_t screen_no_str = { "no", 2 };
434 pjsip_param *old_privacy;
435 pjsip_param *old_screen;
436 pjsip_param *privacy;
437 pjsip_param *screen;
438 int presentation;
439
440 old_privacy = pjsip_param_find(&hdr->other_param, &privacy_str);
441 old_screen = pjsip_param_find(&hdr->other_param, &screen_str);
442
443 if (!old_privacy) {
444 privacy = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
445 privacy->name = privacy_str;
446 pj_list_insert_before(&hdr->other_param, privacy);
447 } else {
448 privacy = old_privacy;
449 }
450
451 if (!old_screen) {
452 screen = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
453 screen->name = screen_str;
454 pj_list_insert_before(&hdr->other_param, screen);
455 } else {
456 screen = old_screen;
457 }
458
459 presentation = ast_party_id_presentation(id);
460 if ((presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED) {
461 privacy->value = privacy_off_str;
462 } else {
463 privacy->value = privacy_full_str;
464 }
466 screen->value = screen_yes_str;
467 } else {
468 screen->value = screen_no_str;
469 }
470}
#define AST_PRES_USER_NUMBER_PASSED_SCREEN
Definition callerid.h:427
#define AST_PRES_NUMBER_TYPE
Definition callerid.h:425

References ast_party_id_presentation(), AST_PRES_ALLOWED, AST_PRES_NUMBER_TYPE, AST_PRES_RESTRICTION, and AST_PRES_USER_NUMBER_PASSED_SCREEN.

Referenced by add_rpid_header().

◆ add_rpid_header()

static void add_rpid_header ( const struct ast_sip_session session,
pjsip_tx_data *  tdata,
const struct ast_party_id id 
)
static

Definition at line 479 of file res_pjsip_caller_id.c.

480{
481 static const pj_str_t pj_rpid_name = { "Remote-Party-ID", 15 };
482 pjsip_fromto_hdr *base;
483 pjsip_fromto_hdr *rpid_hdr;
484 pjsip_fromto_hdr *old_rpid;
485
486 /* Since inv_session reuses responses, we have to make sure there's not already
487 * a P-Asserted-Identity present. If there is, we just modify the old one.
488 */
489 old_rpid = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_rpid_name, NULL);
490 if (old_rpid) {
491 /* If type is OTHER, then the existing header was most likely
492 * added by the PJSIP_HEADER dial plan function as a simple
493 * name/value pair. We can't pass this to modify_id_header because
494 * there are no virtual functions to get the uri. We could parse
495 * it into a pjsip_fromto_hdr but it isn't worth it since
496 * modify_id_header is just going to overwrite the name and number
497 * anyway. We'll just remove it from the header list instead
498 * and create a new one.
499 */
500 if (old_rpid->type == PJSIP_H_OTHER) {
501 pj_list_erase(old_rpid);
502 } else {
503 ast_sip_modify_id_header(tdata->pool, old_rpid, id);
504 add_party_param(tdata, old_rpid, session);
505 add_privacy_params(tdata, old_rpid, id);
506 return;
507 }
508 }
509
510 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
511 base = session->saved_from_hdr ? session->saved_from_hdr : PJSIP_MSG_FROM_HDR(tdata->msg);
512 } else {
513 base = PJSIP_MSG_TO_HDR(tdata->msg);
514 }
515
516 rpid_hdr = create_new_id_hdr(&pj_rpid_name, base, tdata, id);
517 if (!rpid_hdr) {
518 return;
519 }
520 add_party_param(tdata, rpid_hdr, session);
521 add_privacy_params(tdata, rpid_hdr, id);
522 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)rpid_hdr);
523}
static void add_privacy_params(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_party_id *id)
static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session)

References add_party_param(), add_privacy_params(), ast_sip_modify_id_header(), create_new_id_hdr(), NULL, and session.

Referenced by add_id_headers().

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 639 of file res_pjsip_caller_id.c.

◆ caller_id_incoming_request()

static int caller_id_incoming_request ( struct ast_sip_session session,
pjsip_rx_data *  rdata 
)
static

Definition at line 218 of file res_pjsip_caller_id.c.

219{
220 if (!session->channel) {
221 int ani2;
222 /*
223 * Since we have no channel this must be the initial inbound
224 * INVITE. Set the session ID directly because the channel
225 * has not been created yet.
226 */
227 ast_sip_set_id_from_invite(rdata, &session->id, &session->endpoint->id.self, session->endpoint->id.trust_inbound);
228 session->ani2 = set_id_from_oli(rdata, &ani2) ? 0 : ani2;
229 } else {
230 /*
231 * ReINVITE or UPDATE. Check for changes to the ID and queue
232 * a connected line update if necessary.
233 */
235 }
236 return 0;
237}
int ast_sip_set_id_from_invite(struct pjsip_rx_data *rdata, struct ast_party_id *id, struct ast_party_id *default_id, int trust_inbound)
Set the ID from an INVITE.
Definition res_pjsip.c:2827
static void update_incoming_connected_line(struct ast_sip_session *session, pjsip_rx_data *rdata)
static int set_id_from_oli(pjsip_rx_data *rdata, int *ani2)

References ast_sip_set_id_from_invite(), session, set_id_from_oli(), and update_incoming_connected_line().

◆ caller_id_incoming_response()

static void caller_id_incoming_response ( struct ast_sip_session session,
pjsip_rx_data *  rdata 
)
static

Definition at line 248 of file res_pjsip_caller_id.c.

249{
250 if (!session->channel) {
251 return;
252 }
253
255}

References session, and update_incoming_connected_line().

◆ caller_id_outgoing_request()

static void caller_id_outgoing_request ( struct ast_sip_session session,
pjsip_tx_data *  tdata 
)
static

Definition at line 560 of file res_pjsip_caller_id.c.

561{
562 struct ast_party_id effective_id;
563 struct ast_party_id connected_id;
564
565 if (!session->channel) {
566 return;
567 }
568
569 ast_party_id_init(&connected_id);
570 ast_channel_lock(session->channel);
571 effective_id = ast_channel_connected_effective_id(session->channel);
572 ast_party_id_copy(&connected_id, &effective_id);
573 ast_channel_unlock(session->channel);
574
575 add_id_headers(session, tdata, &connected_id);
576 ast_party_id_free(&connected_id);
577}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition channel.c:1725
#define ast_channel_lock(chan)
Definition channel.h:2972
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition channel.c:1779
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.
Definition channel.c:1733
struct ast_party_id ast_channel_connected_effective_id(struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition channel.h:2973
static void add_id_headers(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
Information needed to identify an endpoint in a call.
Definition channel.h:340

References add_id_headers(), ast_channel_connected_effective_id(), ast_channel_lock, ast_channel_unlock, ast_party_id_copy(), ast_party_id_free(), ast_party_id_init(), and session.

◆ caller_id_outgoing_response()

static void caller_id_outgoing_response ( struct ast_sip_session session,
pjsip_tx_data *  tdata 
)
static

Definition at line 588 of file res_pjsip_caller_id.c.

589{
590 struct ast_party_id effective_id;
591 struct ast_party_id connected_id;
592
593 if (!session->channel
594 || (!session->endpoint->id.send_connected_line
595 && session->inv_session
596 && session->inv_session->state >= PJSIP_INV_STATE_EARLY)) {
597 return;
598 }
599
600 /* Must do a deep copy unless we hold the channel lock the entire time. */
601 ast_party_id_init(&connected_id);
602 ast_channel_lock(session->channel);
603 effective_id = ast_channel_connected_effective_id(session->channel);
604 ast_party_id_copy(&connected_id, &effective_id);
605 ast_channel_unlock(session->channel);
606
607 add_id_headers(session, tdata, &connected_id);
608 ast_party_id_free(&connected_id);
609}

References add_id_headers(), ast_channel_connected_effective_id(), ast_channel_lock, ast_channel_unlock, ast_party_id_copy(), ast_party_id_free(), ast_party_id_init(), and session.

◆ create_new_id_hdr()

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 
)
static

Definition at line 266 of file res_pjsip_caller_id.c.

267{
268 pjsip_fromto_hdr *id_hdr;
269 pjsip_name_addr *id_name_addr;
270 pjsip_sip_uri *id_uri;
271
272 id_hdr = pjsip_from_hdr_create(tdata->pool);
273 id_hdr->type = PJSIP_H_OTHER;
274 id_hdr->sname = id_hdr->name = *hdr_name;
275
276 id_name_addr = pjsip_uri_clone(tdata->pool, base->uri);
277 id_uri = pjsip_uri_get_uri(id_name_addr->uri);
278
279 if (id->name.valid && !ast_strlen_zero(id->name.str)) {
280 int name_buf_len = strlen(id->name.str) * 2 + 1;
281 char *name_buf = ast_alloca(name_buf_len);
282
283 ast_escape_quoted(id->name.str, name_buf, name_buf_len);
284 pj_strdup2(tdata->pool, &id_name_addr->display, name_buf);
285 } else {
286 /*
287 * We need to clear the remnants of the clone or it'll be left set.
288 * pj_strdup2 is safe to call with a NULL src and it resets both slen and ptr.
289 */
290 pj_strdup2(tdata->pool, &id_name_addr->display, NULL);
291 }
292
293 if (id->number.valid) {
294 pj_strdup2(tdata->pool, &id_uri->user, id->number.str);
295 } else {
296 /* Similar to name, make sure the number is also cleared when invalid */
297 pj_strdup2(tdata->pool, &id_uri->user, NULL);
298 }
299
300 id_hdr->uri = (pjsip_uri *) id_name_addr;
301 return id_hdr;
302}
enum queue_result id
Definition app_queue.c:1767
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
char * ast_escape_quoted(const char *string, char *outbuf, int buflen)
Escape characters found in a quoted string.
Definition utils.c:817

References ast_alloca, ast_escape_quoted(), ast_strlen_zero(), id, and NULL.

Referenced by add_pai_header(), and add_rpid_header().

◆ extract_oli()

static int extract_oli ( const pjsip_param *  param_list,
char *  buf,
size_t  len 
)
static

Definition at line 38 of file res_pjsip_caller_id.c.

39{
40 static const pj_str_t oli_str1 = { "isup-oli", 8 };
41 static const pj_str_t oli_str2 = { "ss7-oli", 7 };
42 static const pj_str_t oli_str3 = { "oli", 3 };
43 pjsip_param *oli;
44
45 if ((oli = pjsip_param_find(param_list, &oli_str1))
46 || (oli = pjsip_param_find(param_list, &oli_str2))
47 || (oli = pjsip_param_find(param_list, &oli_str3))) {
48 ast_copy_pj_str(buf, &oli->value, len);
49 return 0;
50 }
51 return -1;
52}
char buf[BUFSIZE]
Definition eagi_proxy.c:66
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition res_pjsip.c:2201

References ast_copy_pj_str(), buf, and len().

Referenced by set_id_from_oli().

◆ load_module()

static int load_module ( void  )
static

Definition at line 620 of file res_pjsip_caller_id.c.

621{
622 ast_module_shutdown_ref(AST_MODULE_SELF);
625}
#define ast_module_shutdown_ref(mod)
Prevent unload of the module before shutdown.
Definition module.h:478
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
static struct ast_sip_session_supplement caller_id_supplement
#define ast_sip_session_register_supplement(supplement)

References AST_MODULE_LOAD_SUCCESS, ast_module_shutdown_ref, ast_sip_session_register_supplement, and caller_id_supplement.

◆ queue_connected_line_update()

static void queue_connected_line_update ( struct ast_sip_session session,
const struct ast_party_id id 
)
static

Definition at line 152 of file res_pjsip_caller_id.c.

153{
155 struct ast_party_caller caller;
156
157 /* Fill connected line information */
159 connected.id = *id;
160 connected.id.tag = session->endpoint->id.self.tag;
162
163 /* Save to channel driver copy */
165
166 /* Update our channel CALLERID() */
167 ast_party_caller_init(&caller);
168 caller.id = connected.id;
169 caller.ani = connected.id;
170 caller.ani2 = ast_channel_caller(session->channel)->ani2;
171 ast_channel_set_caller_event(session->channel, &caller, NULL);
172
173 /* Tell peer about the new connected line information. */
175}
@ AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER
Definition callerid.h:554
static int connected
Definition cdr_pgsql.c:73
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...
Definition channel.c:7354
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition channel.c:1990
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
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.
Definition channel.c:9120
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition channel.c:1946
Caller Party information.
Definition channel.h:420
int ani2
Automatic Number Identification 2 (Info Digits)
Definition channel.h:435
Connected Line/Party information.
Definition channel.h:458

References ast_party_caller::ani, ast_party_caller::ani2, ast_channel_caller(), ast_channel_queue_connected_line_update(), ast_channel_set_caller_event(), AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER, ast_party_caller_init(), ast_party_connected_line_init(), ast_party_id_copy(), connected, id, ast_party_caller::id, NULL, and session.

Referenced by update_incoming_connected_line().

◆ set_id_from_oli()

static int set_id_from_oli ( pjsip_rx_data *  rdata,
int *  ani2 
)
static

Definition at line 65 of file res_pjsip_caller_id.c.

66{
67 char oli[AST_CHANNEL_NAME];
68
69 pjsip_fromto_hdr *from = pjsip_msg_find_hdr(rdata->msg_info.msg,
70 PJSIP_H_FROM, rdata->msg_info.msg->hdr.next);
71
72 if (!from) {
73 return -1; /* This had better not happen */
74 }
75
76 /* First, check if it was provided as a header paramter */
77 if (extract_oli(&from->other_param, oli, sizeof(oli))) {
78 /* If not found, check if it was provided as a URI parameter */
79 pjsip_sip_uri *uri;
80 pjsip_name_addr *name_addr = (pjsip_name_addr *) from->uri;
81 if (!ast_sip_is_uri_sip_sips(name_addr->uri)) {
82 return -1;
83 }
84 uri = pjsip_uri_get_uri(name_addr->uri);
85 if (extract_oli(&uri->other_param, oli, sizeof(oli))) {
86 return -1; /* Not found as either type of parameter */
87 }
88 }
89
90 return ast_str_to_int(oli, ani2);
91}
#define AST_CHANNEL_NAME
Definition channel.h:173
int ast_str_to_int(const char *str, int *res)
Convert the given string to a signed integer.
Definition conversions.c:44
int ast_sip_is_uri_sip_sips(pjsip_uri *uri)
Check whether a pjsip_uri is SIP/SIPS or not.
Definition res_pjsip.c:3467
static int extract_oli(const pjsip_param *param_list, char *buf, size_t len)

References AST_CHANNEL_NAME, ast_sip_is_uri_sip_sips(), ast_str_to_int(), and extract_oli().

Referenced by caller_id_incoming_request().

◆ should_queue_connected_line_update()

static int should_queue_connected_line_update ( const struct ast_sip_session session,
const struct ast_party_id id 
)
static

Definition at line 106 of file res_pjsip_caller_id.c.

107{
108 /* Invalid number means no update */
109 if (!id->number.valid) {
110 return 0;
111 }
112
113 /* If the session has never communicated an update or if the
114 * new ID has a different number than the session, then we
115 * should queue an update
116 */
117 if (ast_strlen_zero(session->id.number.str) ||
118 strcmp(session->id.number.str, id->number.str)) {
119 return 1;
120 }
121
122 /* By making it to this point, it means the number is not enough
123 * to determine if an update should be sent. Now we look at
124 * the name
125 */
126
127 /* If the number couldn't warrant an update and the name is
128 * invalid, then no update
129 */
130 if (!id->name.valid) {
131 return 0;
132 }
133
134 /* If the name has changed or we don't have a name set for the
135 * session, then we should send an update
136 */
137 if (ast_strlen_zero(session->id.name.str) ||
138 strcmp(session->id.name.str, id->name.str)) {
139 return 1;
140 }
141
142 /* Neither the name nor the number have changed. No update */
143 return 0;
144}

References ast_strlen_zero(), id, and session.

Referenced by update_incoming_connected_line().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 627 of file res_pjsip_caller_id.c.

628{
630 return 0;
631}
void ast_sip_session_unregister_supplement(struct ast_sip_session_supplement *supplement)
Unregister a an supplement to SIP session processing.

References ast_sip_session_unregister_supplement(), and caller_id_supplement.

◆ update_incoming_connected_line()

static void update_incoming_connected_line ( struct ast_sip_session session,
pjsip_rx_data *  rdata 
)
static

Definition at line 188 of file res_pjsip_caller_id.c.

189{
190 struct ast_party_id id;
191
192 if (!session->endpoint->id.trust_connected_line
193 || !session->endpoint->id.trust_inbound) {
194 return;
195 }
196
198 if (!ast_sip_set_id_connected_line(rdata, &id)) {
201 }
202 }
204}
int ast_sip_set_id_connected_line(struct pjsip_rx_data *rdata, struct ast_party_id *id)
Set the ID for a connected line update.
Definition res_pjsip.c:2822
static void queue_connected_line_update(struct ast_sip_session *session, const struct ast_party_id *id)
static int should_queue_connected_line_update(const struct ast_sip_session *session, const struct ast_party_id *id)

References ast_party_id_free(), ast_party_id_init(), ast_sip_set_id_connected_line(), id, queue_connected_line_update(), session, and should_queue_connected_line_update().

Referenced by caller_id_incoming_request(), and caller_id_incoming_response().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Caller ID Support" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_pjsip_session", }
static

Definition at line 639 of file res_pjsip_caller_id.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 639 of file res_pjsip_caller_id.c.

◆ caller_id_supplement

struct ast_sip_session_supplement caller_id_supplement
static

Definition at line 611 of file res_pjsip_caller_id.c.

611 {
612 .method = "INVITE,UPDATE",
613 .priority = AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL - 1000,
614 .incoming_request = caller_id_incoming_request,
615 .incoming_response = caller_id_incoming_response,
616 .outgoing_request = caller_id_outgoing_request,
617 .outgoing_response = caller_id_outgoing_response,
618};
@ AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL
Definition res_pjsip.h:3339
static void caller_id_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
static void caller_id_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata)
static void caller_id_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata)
static int caller_id_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)

Referenced by load_module(), and unload_module().