Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
res_pjsip_caller_id.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 2013, Digium, Inc.
5 *
6 * Mark Michelson <mmichelson@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19/*** MODULEINFO
20 <depend>pjproject</depend>
21 <depend>res_pjsip</depend>
22 <depend>res_pjsip_session</depend>
23 <support_level>core</support_level>
24 ***/
25
26#include "asterisk.h"
27
28#include <pjsip.h>
29#include <pjsip_ua.h>
30
31#include "asterisk/res_pjsip.h"
33#include "asterisk/channel.h"
34#include "asterisk/module.h"
35#include "asterisk/callerid.h"
37
38static int extract_oli(const pjsip_param *param_list, char *buf, size_t len)
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}
53
54/*!
55 * \internal
56 * \brief Set an ANI2 integer based on OLI data in a From header
57 *
58 * This uses the contents of a From header in order to set Originating Line information.
59 *
60 * \param rdata The incoming message
61 * \param ani2 The ANI2 field to set
62 * \retval 0 Successfully parsed OLI
63 * \retval non-zero Could not parse OLI
64 */
65static int set_id_from_oli(pjsip_rx_data *rdata, int *ani2)
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}
92
93/*!
94 * \internal
95 * \brief Determine if a connected line update should be queued
96 *
97 * This uses information about the session and the ID that would be queued
98 * in the connected line update in order to determine if we should queue
99 * a connected line update.
100 *
101 * \param session The session whose channel we wish to queue the connected line update on
102 * \param id The identification information that would be queued on the connected line update
103 * \retval 0 We should not queue a connected line update
104 * \retval non-zero We should queue a connected line update
105 */
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}
145
146/*!
147 * \internal
148 * \brief Queue a connected line update on a session's channel.
149 * \param session The session whose channel should have the connected line update queued upon.
150 * \param id The identification information to place in the connected line update
151 */
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}
176
177/*!
178 * \internal
179 * \brief Make updates to connected line information based on an incoming request.
180 *
181 * This will get identity information from an incoming request. Once the identification is
182 * retrieved, we will check if the new information warrants a connected line update and queue
183 * a connected line update if so.
184 *
185 * \param session The session on which we received an incoming request
186 * \param rdata The incoming request
187 */
188static void update_incoming_connected_line(struct ast_sip_session *session, pjsip_rx_data *rdata)
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}
205
206/*!
207 * \internal
208 * \brief Session supplement callback on an incoming INVITE request
209 *
210 * If we are receiving an initial INVITE, then we will set the session's identity
211 * based on the INVITE or configured endpoint values. If we are receiving a reinvite,
212 * then we will potentially queue a connected line update via the \ref update_incoming_connected_line
213 * function
214 *
215 * \param session The session that has received an INVITE
216 * \param rdata The incoming INVITE
217 */
218static int caller_id_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
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}
238
239/*!
240 * \internal
241 * \brief Session supplement callback on INVITE response
242 *
243 * INVITE responses could result in queuing connected line updates.
244 *
245 * \param session The session on which communication is happening
246 * \param rdata The incoming INVITE response
247 */
248static void caller_id_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata)
249{
250 if (!session->channel) {
251 return;
252 }
253
255}
256
257/*!
258 * \internal
259 * \brief Create an identity header for an outgoing message
260 * \param hdr_name The name of the header to create
261 * \param base
262 * \param tdata The message to place the header on
263 * \param id The identification information for the new header
264 * \return newly-created header
265 */
266static 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)
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}
303
304/*!
305 * \internal
306 * \brief Add a Privacy header to an outbound message
307 *
308 * When sending a P-Asserted-Identity header, if privacy is requested, then we
309 * will need to indicate such by adding a Privacy header. Similarly, if no
310 * privacy is requested, and a Privacy header already exists on the message,
311 * then the old Privacy header should be removed.
312 *
313 * \param tdata The outbound message to add the Privacy header to
314 * \param id The id information used to determine privacy
315 */
316static void add_privacy_header(pjsip_tx_data *tdata, const struct ast_party_id *id)
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}
334
335/*!
336 * \internal
337 * \brief Add a P-Asserted-Identity header to an outbound message
338 * \param session The session on which communication is happening
339 * \param tdata The message to add the header to
340 * \param id The identification information used to populate the header
341 */
342static void add_pai_header(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
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}
386
387/*!
388 * \internal
389 * \brief Add party parameter to a Remote-Party-ID header.
390 *
391 * \param tdata The message where the Remote-Party-ID header is
392 * \param hdr The header on which the parameters are being added
393 * \param session The session involved
394 */
395static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session)
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}
413
414/*!
415 * \internal
416 * \brief Add privacy and screen parameters to a Remote-Party-ID header.
417 *
418 * If privacy is requested, then the privacy and screen parameters need to
419 * reflect this. Similarly, if no privacy or screening is to be communicated,
420 * we need to make sure that any previously set values are updated.
421 *
422 * \param tdata The message where the Remote-Party-ID header is
423 * \param hdr The header on which the parameters are being added
424 * \param id The identification information used to determine privacy
425 */
426static void add_privacy_params(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_party_id *id)
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}
471
472/*!
473 * \internal
474 * \brief Add a Remote-Party-ID header to an outbound message
475 * \param session The session on which communication is happening
476 * \param tdata The message to add the header to
477 * \param id The identification information used to populate the header
478 */
479static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
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}
524
525/*!
526 * \internal
527 * \brief Add any appropriate identification headers to an outbound SIP message
528 *
529 * This will determine if an outbound message should have identification headers and
530 * will add the appropriately configured headers
531 *
532 * \param session The session on which we will be sending the message
533 * \param tdata The outbound message
534 * \param id The identity information to place on the message
535 */
536static void add_id_headers(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
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}
548
549/*!
550 * \internal
551 * \brief Session supplement callback for outgoing INVITE requests
552 *
553 * On all INVITEs (initial and reinvite) we may add other identity headers
554 * such as P-Asserted-Identity and Remote-Party-ID based on configuration
555 * and privacy settings
556 *
557 * \param session The session on which the INVITE will be sent
558 * \param tdata The outbound INVITE request
559 */
560static void caller_id_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata)
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}
578
579/*!
580 * \internal
581 * \brief Session supplement for outgoing INVITE response
582 *
583 * This will add P-Asserted-Identity and Remote-Party-ID headers if necessary
584 *
585 * \param session The session on which the INVITE response is to be sent
586 * \param tdata The outbound INVITE response
587 */
588static void caller_id_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
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}
610
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};
619
620static int load_module(void)
621{
622 ast_module_shutdown_ref(AST_MODULE_SELF);
625}
626
627static int unload_module(void)
628{
630 return 0;
631}
632
634 .support_level = AST_MODULE_SUPPORT_CORE,
635 .load = load_module,
636 .unload = unload_module,
637 .load_pri = AST_MODPRI_APP_DEPEND,
638 .requires = "res_pjsip,res_pjsip_session",
enum queue_result id
Definition: app_queue.c:1808
if(!yyg->yy_init)
Definition: ast_expr2f.c:854
Asterisk main include file. File version handling, generic pbx functions.
static struct ast_mansession session
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
#define AST_PRES_USER_NUMBER_PASSED_SCREEN
Definition: callerid.h:427
#define AST_PRES_ALLOWED
Definition: callerid.h:432
@ AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER
Definition: callerid.h:554
#define AST_PRES_NUMBER_TYPE
Definition: callerid.h:425
#define AST_PRES_RESTRICTION
Definition: callerid.h:431
General Asterisk PBX channel definitions.
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1784
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition: channel.c:1848
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:7393
#define ast_channel_lock(chan)
Definition: channel.h:2970
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1838
#define AST_CHANNEL_NAME
Definition: channel.h:173
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:1792
struct ast_party_id ast_channel_connected_effective_id(struct ast_channel *chan)
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2049
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:9132
#define ast_channel_unlock(chan)
Definition: channel.h:2971
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition: channel.c:2005
Conversion utility functions.
int ast_str_to_int(const char *str, int *res)
Convert the given string to a signed integer.
Definition: conversions.c:44
char connected
Definition: eagi_proxy.c:82
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)
Asterisk module definitions.
@ AST_MODFLAG_LOAD_ORDER
Definition: module.h:331
#define ast_module_shutdown_ref(mod)
Prevent unload of the module before shutdown.
Definition: module.h:478
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
Definition: module.h:557
@ AST_MODPRI_APP_DEPEND
Definition: module.h:342
@ AST_MODULE_SUPPORT_CORE
Definition: module.h:121
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
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
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
@ AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL
Definition: res_pjsip.h:3339
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
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
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 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 add_privacy_params(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_party_id *id)
static struct ast_sip_session_supplement caller_id_supplement
static void queue_connected_line_update(struct ast_sip_session *session, 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)
static void update_incoming_connected_line(struct ast_sip_session *session, pjsip_rx_data *rdata)
static void add_pai_header(const struct ast_sip_session *session, pjsip_tx_data *tdata, 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)
static void add_privacy_header(pjsip_tx_data *tdata, const struct ast_party_id *id)
static void caller_id_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata)
static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session)
static int set_id_from_oli(pjsip_rx_data *rdata, int *ani2)
static int load_module(void)
static int extract_oli(const pjsip_param *param_list, char *buf, size_t len)
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 unload_module(void)
static void add_id_headers(const struct ast_sip_session *session, pjsip_tx_data *tdata, const struct ast_party_id *id)
static int caller_id_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
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.
#define ast_sip_session_register_supplement(supplement)
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
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Caller Party information.
Definition: channel.h:420
struct ast_party_id id
Caller party ID.
Definition: channel.h:422
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:435
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:429
Connected Line/Party information.
Definition: channel.h:458
Information needed to identify an endpoint in a call.
Definition: channel.h:340
A supplement to SIP message processing.
A structure describing a SIP session.
char * ast_escape_quoted(const char *string, char *outbuf, int buflen)
Escape characters found in a quoted string.
Definition: utils.c:781