73 && !strchr(
"-.!%*_+`'~", *
str)) {
130 pjsip_supported_hdr *hdr;
133 hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_SUPPORTED,
NULL);
136 hdr = pjsip_supported_hdr_create(tdata->pool);
141 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr);
147 for (i = 0; i < hdr->count; ++i) {
153 if (hdr->count >= PJSIP_GENERIC_ARRAY_MAX_COUNT) {
200 static const pj_str_t from_name = {
"From", 4 };
202 pjsip_generic_string_hdr *hdr;
206 if (!(hdr = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &
diversion_name,
NULL))) {
210 pj_strdup_with_null(rdata->tp_info.pool, &
value, &hdr->hvalue);
213 return pjsip_parse_hdr(rdata->tp_info.pool, &from_name,
value.ptr,
214 pj_strlen(&
value), &size);
225 static const pj_str_t from_name = {
"From", 4 };
226 pjsip_fromto_hdr * result_hdr =
NULL;
228 pjsip_generic_string_hdr *hdr =
NULL;
237 static const pj_str_t index_name = {
"index", 5 };
240 pjsip_fromto_hdr * fromto_hdr =
NULL;
241 pjsip_param * index =
NULL;
243 pj_strdup_with_null(rdata->tp_info.pool, &
value, &hdr->hvalue);
246 fromto_hdr = pjsip_parse_hdr(rdata->tp_info.pool, &from_name,
value.ptr,
247 pj_strlen(&
value), &size);
249 if (fromto_hdr ==
NULL) {
253 index = pjsip_param_find(&fromto_hdr->other_param, &index_name);
256 if (!pj_strcmp2(&index->value,
"1")) {
265 result_hdr = fromto_hdr;
267 }
while ((hdr = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &
history_info_name, hdr->next)));
284 pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri);
288 uri_user = uri->user;
291 semi = pj_strchr(&uri_user,
';');
304 pj_strset(&uri_user, (
char *) pj_strbuf(&uri_user), semi - pj_strbuf(&uri_user));
307 if (pj_strlen(&uri_user)) {
313 if (pj_strlen(&name_addr->display)) {
337 static const pj_str_t cause_name = {
"cause", 5 };
338 pjsip_uri *uri = name_addr->uri;
339 pjsip_param *cause =
NULL;
340 unsigned long cause_value = 0;
352 cause_value = pj_strtoul(&cause->value);
362 static const pj_str_t reason_name = {
"reason", 6 };
363 pjsip_param *reason = pjsip_param_find(&from_info->other_param, &reason_name);
381 if (*reason_str ==
'"') {
386 if (data->
code < 0) {
395 pjsip_fromto_hdr *from_info,
396 pjsip_name_addr *to_info,
430 if (
session->inv_session->role == PJSIP_ROLE_UAC && send_update) {
444 pjsip_fromto_hdr *history_info_to;
445 pjsip_fromto_hdr *history_info_from;
448 if (history_info_to) {
461 static const pj_str_t contact_name = {
"Contact", 7 };
462 static const pj_str_t contact_name_s = {
"m", 1 };
464 pjsip_status_line
status = rdata->msg_info.msg->line.status;
465 pjsip_fromto_hdr *div_hdr;
466 pjsip_fromto_hdr *history_info_to;
467 pjsip_fromto_hdr *history_info_from;
468 pjsip_contact_hdr *contact_hdr;
480 if (history_info_to) {
487 if (!div_hdr && !
session->id.number.valid) {
488 div_hdr = PJSIP_MSG_TO_HDR(rdata->msg_info.msg);
495 contact_hdr = pjsip_msg_find_hdr_by_names(rdata->msg_info.msg, &contact_name, &contact_name_s,
NULL);
497 (pjsip_name_addr*)PJSIP_MSG_FROM_HDR(rdata->msg_info.msg)->uri, send_update);
501 div_hdr ? (pjsip_name_addr*)div_hdr->uri :
NULL, send_update);
529 static const pj_str_t reason_name = {
"reason", 6 };
531 pjsip_fromto_hdr *hdr;
532 pjsip_name_addr *name_addr;
534 pjsip_fromto_hdr *old_hdr;
535 const char *reason_str;
536 const char *quote_str;
541 if (tdata->msg->type == PJSIP_REQUEST_MSG) {
548 base = PJSIP_MSG_FROM_HDR(tdata->msg)->uri;
554 hdr = pjsip_from_hdr_create(tdata->pool);
555 hdr->type = PJSIP_H_OTHER;
558 name_addr = pjsip_uri_clone(tdata->pool, base);
560 pj_strdup2(tdata->pool, &name_addr->display,
id->name.str);
563 param = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
564 param->name = reason_name;
569 quote_str = *reason_str ==
'\"' ||
sip_is_token(reason_str) ?
"" :
"\"";
571 reason_buf = pj_pool_alloc(tdata->pool, strlen(reason_str) + 3);
572 sprintf(reason_buf,
"%s%s%s", quote_str, reason_str, quote_str);
574 param->value = pj_str(reason_buf);
576 pj_list_insert_before(&hdr->other_param, param);
578 hdr->uri = (pjsip_uri *) name_addr;
581 pj_list_erase(old_hdr);
583 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr);
595 static const pj_str_t index_name = {
"index", 5 };
596 static const pj_str_t cause_name = {
"cause", 5 };
597 static const pj_str_t first_index = {
"1", 1 };
598 static const pj_str_t last_index = {
"1.1", 3 };
600 pjsip_fromto_hdr *hdr;
601 pjsip_name_addr *name_addr;
604 pjsip_fromto_hdr *old_hdr;
611 pjsip_uri *base = PJSIP_MSG_TO_HDR(tdata->msg)->uri;
614 hdr = pjsip_from_hdr_create(tdata->pool);
615 hdr->type = PJSIP_H_OTHER;
618 name_addr = pjsip_uri_clone(tdata->pool, base);
619 uri = pjsip_uri_get_uri(name_addr->uri);
623 pj_strdup2(tdata->pool, &name_addr->display, from->
name.
str);
624 pj_strdup2(tdata->pool, &uri->user, from->
number.
str);
627 param = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
628 param->name = index_name;
629 param->value = first_index;
632 pj_list_insert_before(&hdr->other_param, param);
633 hdr->uri = (pjsip_uri *) name_addr;
636 pj_list_erase(old_hdr);
639 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr);
645 hdr = pjsip_from_hdr_create(tdata->pool);
646 hdr->type = PJSIP_H_OTHER;
649 name_addr = pjsip_uri_clone(tdata->pool, base);
650 uri = pjsip_uri_get_uri(name_addr->uri);
652 pj_strdup2(tdata->pool, &name_addr->display, to->
name.
str);
653 pj_strdup2(tdata->pool, &uri->user, to->
number.
str);
655 param = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
656 param->name = index_name;
657 param->value = last_index;
658 pj_list_insert_before(&hdr->other_param, param);
660 param = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
661 param->name = cause_name;
663 cause_buf = pj_pool_alloc(tdata->pool, 4);
664 snprintf(cause_buf, 4,
"%ud", cause);
665 param->value = pj_str(cause_buf);
666 pj_list_insert_before(&uri->other_param, param);
667 hdr->uri = (pjsip_uri *) name_addr;
669 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr);
682 if (
session->channel &&
session->endpoint->id.send_history_info) {
710 struct pjsip_status_line
status = tdata->msg->line.status;
713 if (PJSIP_IS_STATUS_IN_CLASS(
status.code, 300) || (
status.code == 181)) {
761 .
requires =
"res_pjsip,res_pjsip_session",
struct sla_ringing_trunk * first
Asterisk main include file. File version handling, generic pbx functions.
static struct ast_mansession session
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ast_malloc(len)
A wrapper for malloc()
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
AST_REDIRECTING_REASON
redirecting reason codes.
@ AST_REDIRECTING_REASON_AWAY
@ AST_REDIRECTING_REASON_UNKNOWN
@ AST_REDIRECTING_REASON_SEND_TO_VM
@ AST_REDIRECTING_REASON_NO_ANSWER
@ AST_REDIRECTING_REASON_DO_NOT_DISTURB
@ AST_REDIRECTING_REASON_FOLLOW_ME
@ AST_REDIRECTING_REASON_DEFLECTION
@ AST_REDIRECTING_REASON_UNAVAILABLE
@ AST_REDIRECTING_REASON_UNCONDITIONAL
@ AST_REDIRECTING_REASON_CALL_FWD_DTE
@ AST_REDIRECTING_REASON_OUT_OF_ORDER
@ AST_REDIRECTING_REASON_TIME_OF_DAY
@ AST_REDIRECTING_REASON_USER_BUSY
int ast_redirecting_reason_parse(const char *data)
Convert redirecting reason text code to value (used in config file parsing)
General Asterisk PBX channel definitions.
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Set the redirecting id information in the Asterisk channel.
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Queue a redirecting update frame on a channel.
void ast_set_party_id_all(struct ast_set_party_id *update_id)
Set the update marker to update all information of a corresponding party id.
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.
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Asterisk module definitions.
#define ast_module_shutdown_ref(mod)
Prevent unload of the module before shutdown.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
@ AST_MODULE_LOAD_SUCCESS
struct pjsip_param * ast_sip_pjsip_uri_get_other_param(pjsip_uri *uri, const pj_str_t *param_str)
Find an 'other' SIP/SIPS URI parameter by name.
const pj_str_t * ast_sip_pjsip_uri_get_username(pjsip_uri *uri)
Get the user portion of the pjsip_uri.
int ast_sip_is_allowed_uri(pjsip_uri *uri)
Check whether a pjsip_uri is allowed or not.
@ AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL
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.
static void set_redirecting_reason(pjsip_fromto_hdr *from_info, pjsip_name_addr *to_info, struct ast_party_redirecting_reason *data)
static void diversion_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata, pjsip_diversion_send_update send_update)
static const struct reasons reason_table[]
static void diversion_incoming_response_redirecting(struct ast_sip_session *session, pjsip_rx_data *rdata)
static pjsip_fromto_hdr * get_history_info_header(pjsip_rx_data *rdata, const unsigned int first)
static const unsigned int reason_code_to_cause(const struct ast_party_redirecting_reason *reason)
static struct ast_sip_session_supplement diversion_supplement_redirecting
static void add_history_info_header(pjsip_tx_data *tdata, struct ast_party_redirecting *data)
pjsip_diversion_send_update
@ PJSIP_DIVERSION_NOSEND_UPDATE
@ PJSIP_DIVERSION_SEND_UPDATE
static void set_redirecting_reason_by_cause(pjsip_name_addr *name_addr, struct ast_party_redirecting_reason *data)
static const pj_str_t history_info_name
static int add_supported(pjsip_tx_data *tdata)
static pj_str_t HISTINFO_SUPPORTED_NAME
static pjsip_fromto_hdr * get_diversion_header(pjsip_rx_data *rdata)
static int diversion_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
static void diversion_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata)
static const pj_str_t diversion_name
static void diversion_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
static void diversion_incoming_response_media(struct ast_sip_session *session, pjsip_rx_data *rdata)
static void set_redirecting(struct ast_sip_session *session, pjsip_fromto_hdr *from_info, pjsip_name_addr *to_info, pjsip_diversion_send_update send_update)
static void get_redirecting_add_diversion(struct ast_sip_session *session, pjsip_tx_data *tdata)
static void set_redirecting_value(char **dst, const pj_str_t *src)
static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data, struct ast_set_party_id *update)
static int load_module(void)
static struct ast_sip_session_supplement diversion_supplement_media
static const char * reason_code_to_str(const struct ast_party_redirecting_reason *reason)
static int unload_module(void)
static int sip_is_token(const char *str)
static enum AST_REDIRECTING_REASON cause_to_reason(const unsigned long cause)
static void add_diversion_header(pjsip_tx_data *tdata, struct ast_party_redirecting *data)
static void copy_redirecting_id(struct ast_party_id *dst, const struct ast_party_id *src, struct ast_set_party_id *update)
@ AST_SIP_SESSION_BEFORE_REDIRECTING
@ AST_SIP_SESSION_BEFORE_MEDIA
#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.
String manipulation functions.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
Information needed to identify an endpoint in a call.
struct ast_party_name name
Subscriber name.
struct ast_party_number number
Subscriber phone number.
unsigned char valid
TRUE if the name information is valid/present.
char * str
Subscriber name (Malloced)
unsigned char valid
TRUE if the number information is valid/present.
char * str
Subscriber phone number (Malloced)
Redirecting reason information.
int code
enum AST_REDIRECTING_REASON value for redirection
char * str
a string value for the redirecting reason
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
struct ast_party_redirecting_reason reason
Reason for the redirection.
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
int count
Number of times the call was redirected.
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Indicate what information in ast_party_id should be set.
Indicate what information in ast_party_redirecting should be set.
A supplement to SIP message processing.
A structure describing a SIP session.
Diversion header reasons.
enum AST_REDIRECTING_REASON code