diff --git a/res/res_pjsip_caller_id.c b/res/res_pjsip_caller_id.c index f15a66c050..2481a3f529 100644 --- a/res/res_pjsip_caller_id.c +++ b/res/res_pjsip_caller_id.c @@ -542,6 +542,33 @@ static void add_pai_header(const struct ast_sip_session *session, pjsip_tx_data pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr); } +/*! + * \internal + * \brief Add party parameter to a Remote-Party-ID header. + * + * \param tdata The message where the Remote-Party-ID header is + * \param hdr The header on which the parameters are being added + * \param session The session involved + */ +static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session) +{ + static const pj_str_t party_str = { "party", 5 }; + static const pj_str_t calling_str = { "calling", 7 }; + static const pj_str_t called_str = { "called", 6 }; + pjsip_param *party; + + /* The party value can't change throughout the lifetime, so it is set only once */ + party = pjsip_param_find(&hdr->other_param, &party_str); + if (party) { + return; + } + + party = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param); + party->name = party_str; + party->value = (session->inv_session->role == PJSIP_ROLE_UAC) ? calling_str : called_str; + pj_list_insert_before(&hdr->other_param, party); +} + /*! * \internal * \brief Add privacy and screen parameters to a Remote-Party-ID header. @@ -631,6 +658,7 @@ static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data pj_list_erase(old_rpid); } else { ast_sip_modify_id_header(tdata->pool, old_rpid, id); + add_party_param(tdata, old_rpid, session); add_privacy_params(tdata, old_rpid, id); return; } @@ -646,6 +674,7 @@ static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data if (!rpid_hdr) { return; } + add_party_param(tdata, rpid_hdr, session); add_privacy_params(tdata, rpid_hdr, id); pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)rpid_hdr); }