Asterisk - The Open Source Telephony Project GIT-master-d856a3e
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 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 = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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 625 of file res_pjsip_caller_id.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 625 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 522 of file res_pjsip_caller_id.c.

523{
525 return;
526 }
527 if (session->endpoint->id.send_pai) {
528 add_pai_header(session, tdata, id);
529 }
530 if (session->endpoint->id.send_rpid) {
531 add_rpid_header(session, tdata, id);
532 }
533}
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 328 of file res_pjsip_caller_id.c.

329{
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;
334
335 /* Since inv_session reuses responses, we have to make sure there's not already
336 * a P-Asserted-Identity present. If there is, we just modify the old one.
337 */
338 old_pai = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_pai_name, NULL);
339 if (old_pai) {
340 /* If type is OTHER, then the existing header was most likely
341 * added by the PJSIP_HEADER dial plan function as a simple
342 * name/value pair. We can't pass this to modify_id_header because
343 * there are no virtual functions to get the uri. We could parse
344 * it into a pjsip_fromto_hdr but it isn't worth it since
345 * modify_id_header is just going to overwrite the name and number
346 * anyway. We'll just remove it from the header list instead
347 * and create a new one.
348 */
349 if (old_pai->type == PJSIP_H_OTHER) {
350 pj_list_erase(old_pai);
351 } else {
352 ast_sip_modify_id_header(tdata->pool, old_pai, id);
353 add_privacy_header(tdata, id);
354 return;
355 }
356 }
357
358 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
359 base = session->saved_from_hdr ? session->saved_from_hdr : PJSIP_MSG_FROM_HDR(tdata->msg);
360 } else {
361 base = PJSIP_MSG_TO_HDR(tdata->msg);
362 }
363
364 pai_hdr = create_new_id_hdr(&pj_pai_name, base, tdata, id);
365 if (!pai_hdr) {
366 return;
367 }
368 add_privacy_header(tdata, id);
369
370 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr);
371}
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 381 of file res_pjsip_caller_id.c.

382{
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 };
386 pjsip_param *party;
387
388 /* The party value can't change throughout the lifetime, so it is set only once */
389 party = pjsip_param_find(&hdr->other_param, &party_str);
390 if (party) {
391 return;
392 }
393
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);
398}

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 302 of file res_pjsip_caller_id.c.

303{
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;
307
308 old_privacy = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_privacy_name, NULL);
309
311 if (old_privacy) {
312 pj_list_erase(old_privacy);
313 }
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);
318 }
319}
#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:1840

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 412 of file res_pjsip_caller_id.c.

413{
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;
423 pjsip_param *screen;
424 int presentation;
425
426 old_privacy = pjsip_param_find(&hdr->other_param, &privacy_str);
427 old_screen = pjsip_param_find(&hdr->other_param, &screen_str);
428
429 if (!old_privacy) {
430 privacy = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
431 privacy->name = privacy_str;
432 pj_list_insert_before(&hdr->other_param, privacy);
433 } else {
434 privacy = old_privacy;
435 }
436
437 if (!old_screen) {
438 screen = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
439 screen->name = screen_str;
440 pj_list_insert_before(&hdr->other_param, screen);
441 } else {
442 screen = old_screen;
443 }
444
445 presentation = ast_party_id_presentation(id);
446 if ((presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED) {
447 privacy->value = privacy_off_str;
448 } else {
449 privacy->value = privacy_full_str;
450 }
452 screen->value = screen_yes_str;
453 } else {
454 screen->value = screen_no_str;
455 }
456}
#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 465 of file res_pjsip_caller_id.c.

466{
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;
471
472 /* Since inv_session reuses responses, we have to make sure there's not already
473 * a P-Asserted-Identity present. If there is, we just modify the old one.
474 */
475 old_rpid = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_rpid_name, NULL);
476 if (old_rpid) {
477 /* If type is OTHER, then the existing header was most likely
478 * added by the PJSIP_HEADER dial plan function as a simple
479 * name/value pair. We can't pass this to modify_id_header because
480 * there are no virtual functions to get the uri. We could parse
481 * it into a pjsip_fromto_hdr but it isn't worth it since
482 * modify_id_header is just going to overwrite the name and number
483 * anyway. We'll just remove it from the header list instead
484 * and create a new one.
485 */
486 if (old_rpid->type == PJSIP_H_OTHER) {
487 pj_list_erase(old_rpid);
488 } else {
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);
492 return;
493 }
494 }
495
496 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
497 base = session->saved_from_hdr ? session->saved_from_hdr : PJSIP_MSG_FROM_HDR(tdata->msg);
498 } else {
499 base = PJSIP_MSG_TO_HDR(tdata->msg);
500 }
501
502 rpid_hdr = create_new_id_hdr(&pj_rpid_name, base, tdata, id);
503 if (!rpid_hdr) {
504 return;
505 }
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);
509}
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 625 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 204 of file res_pjsip_caller_id.c.

205{
206 if (!session->channel) {
207 int ani2;
208 /*
209 * Since we have no channel this must be the initial inbound
210 * INVITE. Set the session ID directly because the channel
211 * has not been created yet.
212 */
213 ast_sip_set_id_from_invite(rdata, &session->id, &session->endpoint->id.self, session->endpoint->id.trust_inbound);
214 session->ani2 = set_id_from_oli(rdata, &ani2) ? 0 : ani2;
215 } else {
216 /*
217 * ReINVITE or UPDATE. Check for changes to the ID and queue
218 * a connected line update if necessary.
219 */
221 }
222 return 0;
223}
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 234 of file res_pjsip_caller_id.c.

235{
236 if (!session->channel) {
237 return;
238 }
239
241}

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 546 of file res_pjsip_caller_id.c.

547{
548 struct ast_party_id effective_id;
549 struct ast_party_id connected_id;
550
551 if (!session->channel) {
552 return;
553 }
554
555 ast_party_id_init(&connected_id);
556 ast_channel_lock(session->channel);
557 effective_id = ast_channel_connected_effective_id(session->channel);
558 ast_party_id_copy(&connected_id, &effective_id);
559 ast_channel_unlock(session->channel);
560
561 add_id_headers(session, tdata, &connected_id);
562 ast_party_id_free(&connected_id);
563}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1776
#define ast_channel_lock(chan)
Definition: channel.h:2968
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1830
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:1784
struct ast_party_id ast_channel_connected_effective_id(struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2969
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 574 of file res_pjsip_caller_id.c.

575{
576 struct ast_party_id effective_id;
577 struct ast_party_id connected_id;
578
579 if (!session->channel
580 || (!session->endpoint->id.send_connected_line
581 && session->inv_session
582 && session->inv_session->state >= PJSIP_INV_STATE_EARLY)) {
583 return;
584 }
585
586 /* Must do a deep copy unless we hold the channel lock the entire time. */
587 ast_party_id_init(&connected_id);
588 ast_channel_lock(session->channel);
589 effective_id = ast_channel_connected_effective_id(session->channel);
590 ast_party_id_copy(&connected_id, &effective_id);
591 ast_channel_unlock(session->channel);
592
593 add_id_headers(session, tdata, &connected_id);
594 ast_party_id_free(&connected_id);
595}

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 252 of file res_pjsip_caller_id.c.

253{
254 pjsip_fromto_hdr *id_hdr;
255 pjsip_name_addr *id_name_addr;
256 pjsip_sip_uri *id_uri;
257
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;
261
262 id_name_addr = pjsip_uri_clone(tdata->pool, base->uri);
263 id_uri = pjsip_uri_get_uri(id_name_addr->uri);
264
265 if (id->name.valid && !ast_strlen_zero(id->name.str)) {
266 int name_buf_len = strlen(id->name.str) * 2 + 1;
267 char *name_buf = ast_alloca(name_buf_len);
268
269 ast_escape_quoted(id->name.str, name_buf, name_buf_len);
270 pj_strdup2(tdata->pool, &id_name_addr->display, name_buf);
271 } else {
272 /*
273 * We need to clear the remnants of the clone or it'll be left set.
274 * pj_strdup2 is safe to call with a NULL src and it resets both slen and ptr.
275 */
276 pj_strdup2(tdata->pool, &id_name_addr->display, NULL);
277 }
278
279 if (id->number.valid) {
280 pj_strdup2(tdata->pool, &id_uri->user, id->number.str);
281 } else {
282 /* Similar to name, make sure the number is also cleared when invalid */
283 pj_strdup2(tdata->pool, &id_uri->user, NULL);
284 }
285
286 id_hdr->uri = (pjsip_uri *) id_name_addr;
287 return id_hdr;
288}
enum queue_result id
Definition: app_queue.c:1638
#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:781

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

Referenced by add_pai_header(), and add_rpid_header().

◆ load_module()

static int load_module ( void  )
static

Definition at line 606 of file res_pjsip_caller_id.c.

607{
608 ast_module_shutdown_ref(AST_MODULE_SELF);
611}
#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 138 of file res_pjsip_caller_id.c.

139{
141 struct ast_party_caller caller;
142
143 /* Fill connected line information */
145 connected.id = *id;
146 connected.id.tag = session->endpoint->id.self.tag;
148
149 /* Save to channel driver copy */
151
152 /* Update our channel CALLERID() */
153 ast_party_caller_init(&caller);
154 caller.id = connected.id;
155 caller.ani = connected.id;
156 caller.ani2 = ast_channel_caller(session->channel)->ani2;
157 ast_channel_set_caller_event(session->channel, &caller, NULL);
158
159 /* Tell peer about the new connected line information. */
161}
@ AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER
Definition: callerid.h:554
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:7394
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2041
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:9128
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition: channel.c:1997
char connected
Definition: eagi_proxy.c:82
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 49 of file res_pjsip_caller_id.c.

50{
51 char oli[AST_CHANNEL_NAME];
52
53 pjsip_param *oli1, *oli2, *oli3;
54
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 };
58
59 pjsip_fromto_hdr *from = pjsip_msg_find_hdr(rdata->msg_info.msg,
60 PJSIP_H_FROM, rdata->msg_info.msg->hdr.next);
61
62 if (!from) {
63 return -1; /* This had better not happen */
64 }
65
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));
72 } else {
73 return -1;
74 }
75
76 return ast_str_to_int(oli, ani2);
77}
#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
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_CHANNEL_NAME, ast_copy_pj_str(), and ast_str_to_int().

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 92 of file res_pjsip_caller_id.c.

93{
94 /* Invalid number means no update */
95 if (!id->number.valid) {
96 return 0;
97 }
98
99 /* If the session has never communicated an update or if the
100 * new ID has a different number than the session, then we
101 * should queue an update
102 */
103 if (ast_strlen_zero(session->id.number.str) ||
104 strcmp(session->id.number.str, id->number.str)) {
105 return 1;
106 }
107
108 /* By making it to this point, it means the number is not enough
109 * to determine if an update should be sent. Now we look at
110 * the name
111 */
112
113 /* If the number couldn't warrant an update and the name is
114 * invalid, then no update
115 */
116 if (!id->name.valid) {
117 return 0;
118 }
119
120 /* If the name has changed or we don't have a name set for the
121 * session, then we should send an update
122 */
123 if (ast_strlen_zero(session->id.name.str) ||
124 strcmp(session->id.name.str, id->name.str)) {
125 return 1;
126 }
127
128 /* Neither the name nor the number have changed. No update */
129 return 0;
130}

References ast_strlen_zero(), id, and session.

Referenced by update_incoming_connected_line().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 613 of file res_pjsip_caller_id.c.

614{
616 return 0;
617}
void ast_sip_session_unregister_supplement(struct ast_sip_session_supplement *supplement)
Unregister a an supplement to SIP session processing.
Definition: pjsip_session.c:63

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 174 of file res_pjsip_caller_id.c.

175{
176 struct ast_party_id id;
177
178 if (!session->endpoint->id.trust_connected_line
179 || !session->endpoint->id.trust_inbound) {
180 return;
181 }
182
184 if (!ast_sip_set_id_connected_line(rdata, &id)) {
187 }
188 }
190}
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 = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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 625 of file res_pjsip_caller_id.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 625 of file res_pjsip_caller_id.c.

◆ caller_id_supplement

struct ast_sip_session_supplement caller_id_supplement
static

Definition at line 597 of file res_pjsip_caller_id.c.

Referenced by load_module(), and unload_module().