Asterisk - The Open Source Telephony Project GIT-master-7805f28
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
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 = "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 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:1788

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:1724
#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:1778
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:1732
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:1808
#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().

◆ 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
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:7345
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:1989
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:9111
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition: channel.c:1945
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 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}
if(!yyg->yy_init)
Definition: ast_expr2f.c:854
#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(), extract_oli(), and if().

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.
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 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 = "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 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.

Referenced by load_module(), and unload_module().