static void set_redirecting_reason(pjsip_fromto_hdr *hdr, struct ast_party_redirecting_reason *data) { static const pj_str_t reason_name = { "reason", 6 }; pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name); char *reason_str; if (!reason) { return; } set_redirecting_value(&data->str, &reason->value); if (!data->str) { /* Oops, allocation failure */ return; } reason_str = ast_strdupa(data->str); /* Remove any enclosing double-quotes */ if (*reason_str == '"') { reason_str = ast_strip_quoted(reason_str, "\"", "\""); } data->code = ast_redirecting_reason_parse(reason_str); if (data->code < 0) { data->code = AST_REDIRECTING_REASON_UNKNOWN; } else { ast_free(data->str); data->str = ast_strdup(""); } }
static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data, struct ast_set_party_id *update) { pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri); if (pj_strlen(&uri->user)) { update->number = 1; data->number.valid = 1; set_redirecting_value(&data->number.str, &uri->user); } if (pj_strlen(&name_addr->display)) { update->name = 1; data->name.valid = 1; set_redirecting_value(&data->name.str, &name_addr->display); } }
static void set_redirecting_reason(pjsip_fromto_hdr *hdr, struct ast_party_redirecting_reason *data) { static const pj_str_t reason_name = { "reason", 6 }; pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name); if (!reason) { return; } set_redirecting_value(&data->str, &reason->value); data->code = reason_str_to_code(data->str); }
static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data, struct ast_set_party_id *update) { pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri); char *semi; pj_str_t uri_user; uri_user = uri->user; /* Always truncate redirecting number at a semicolon. */ semi = pj_strchr(&uri_user, ';'); if (semi) { /* * We need to be able to handle URI's looking like * "sip:1235557890;[email protected];user=phone" * * Where the uri->user field will result in: * "1235557890;phone-context=national" * * People don't care about anything after the semicolon * showing up on their displays even though the RFC * allows the semicolon. */ pj_strset(&uri_user, (char *) pj_strbuf(&uri_user), semi - pj_strbuf(&uri_user)); } if (pj_strlen(&uri_user)) { update->number = 1; data->number.valid = 1; set_redirecting_value(&data->number.str, &uri_user); } if (pj_strlen(&name_addr->display)) { update->name = 1; data->name.valid = 1; set_redirecting_value(&data->name.str, &name_addr->display); } }