/*! * \internal * \brief Create an identity header for an outgoing message * \param hdr_name The name of the header to create * \param tdata The message to place the header on * \param id The identification information for the new header * \return newly-created header */ static pjsip_fromto_hdr *create_new_id_hdr(const pj_str_t *hdr_name, pjsip_tx_data *tdata, const struct ast_party_id *id) { pjsip_fromto_hdr *id_hdr; pjsip_fromto_hdr *base; pjsip_name_addr *id_name_addr; pjsip_sip_uri *id_uri; base = tdata->msg->type == PJSIP_REQUEST_MSG ? PJSIP_MSG_FROM_HDR(tdata->msg) : PJSIP_MSG_TO_HDR(tdata->msg); id_hdr = pjsip_from_hdr_create(tdata->pool); id_hdr->type = PJSIP_H_OTHER; pj_strdup(tdata->pool, &id_hdr->name, hdr_name); id_hdr->sname.slen = 0; id_name_addr = pjsip_uri_clone(tdata->pool, base->uri); id_uri = pjsip_uri_get_uri(id_name_addr->uri); if (id->name.valid) { int name_buf_len = strlen(id->name.str) * 2 + 1; char *name_buf = ast_alloca(name_buf_len); ast_escape_quoted(id->name.str, name_buf, name_buf_len); pj_strdup2(tdata->pool, &id_name_addr->display, name_buf); } pj_strdup2(tdata->pool, &id_uri->user, id->number.str); id_hdr->uri = (pjsip_uri *) id_name_addr; return id_hdr; }
/*! * \internal * \brief Create an identity header for an outgoing message * \param hdr_name The name of the header to create * \param tdata The message to place the header on * \param id The identification information for the new header * \return newly-created header */ 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) { pjsip_fromto_hdr *id_hdr; pjsip_name_addr *id_name_addr; pjsip_sip_uri *id_uri; id_hdr = pjsip_from_hdr_create(tdata->pool); id_hdr->type = PJSIP_H_OTHER; pj_strdup(tdata->pool, &id_hdr->name, hdr_name); id_hdr->sname.slen = 0; id_name_addr = pjsip_uri_clone(tdata->pool, base->uri); id_uri = pjsip_uri_get_uri(id_name_addr->uri); if (id->name.valid) { int name_buf_len = strlen(id->name.str) * 2 + 1; char *name_buf = ast_alloca(name_buf_len); ast_escape_quoted(id->name.str, name_buf, name_buf_len); pj_strdup2(tdata->pool, &id_name_addr->display, name_buf); } else { /* * We need to clear the remnants of the clone or it'll be left set. * pj_strdup2 is safe to call with a NULL src and it resets both slen and ptr. */ pj_strdup2(tdata->pool, &id_name_addr->display, NULL); } pj_strdup2(tdata->pool, &id_uri->user, id->number.str); id_hdr->uri = (pjsip_uri *) id_name_addr; return id_hdr; }
char *ast_callerid_merge(char *buf, int bufsiz, const char *name, const char *num, const char *unknown) { if (!unknown) unknown = "<unknown>"; if (name && num) { char name_buf[128]; ast_escape_quoted(name, name_buf, sizeof(name_buf)); snprintf(buf, bufsiz, "\"%s\" <%s>", name_buf, num); } else if (name) { ast_copy_string(buf, name, bufsiz); } else if (num) { ast_copy_string(buf, num, bufsiz); } else { ast_copy_string(buf, unknown, bufsiz); } return buf; }
/*! * \internal * \brief Set name and number information on an identity header. * \param pool Memory pool to use for string duplication * \param id_hdr A From, P-Asserted-Identity, or Remote-Party-ID header to modify * \param id The identity information to apply to the header */ static void modify_id_header(pj_pool_t *pool, pjsip_fromto_hdr *id_hdr, const struct ast_party_id *id) { pjsip_name_addr *id_name_addr; pjsip_sip_uri *id_uri; id_name_addr = (pjsip_name_addr *) id_hdr->uri; id_uri = pjsip_uri_get_uri(id_name_addr->uri); if (id->name.valid) { int name_buf_len = strlen(id->name.str) * 2 + 1; char *name_buf = ast_alloca(name_buf_len); ast_escape_quoted(id->name.str, name_buf, name_buf_len); pj_strdup2(pool, &id_name_addr->display, name_buf); } if (id->number.valid) { pj_strdup2(pool, &id_uri->user, id->number.str); } }