From 60c0d5c2b61b7bb39c03b712e2f0913e6a6de508 Mon Sep 17 00:00:00 2001 From: Brian West Date: Thu, 28 May 2009 22:46:17 +0000 Subject: [PATCH] Update CID on Polycom when doing an Attended transfer, Make send_display work with Polycom and others, add patch with mods from SFSIP-111 HOME RUN. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13492 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/mod_sofia.c | 35 ++++++++++++++++++++++--- src/mod/endpoints/mod_sofia/sofia.c | 26 +++++++++++------- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index ddf4c30dc9..5f88aa52b5 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -175,6 +175,22 @@ static switch_status_t sofia_on_execute(switch_core_session_t *session) return SWITCH_STATUS_SUCCESS; } +char * generate_pai_str(switch_core_session_t *session) +{ + private_object_t *tech_pvt = (private_object_t *) switch_core_session_get_private(session); + const char *callee_name = NULL, *callee_number = NULL; + + if (!(callee_name = switch_channel_get_variable(tech_pvt->channel, "callee_id_name"))) { + callee_name = ""; + } + + if (!(callee_number = switch_channel_get_variable(tech_pvt->channel, "callee_id_number"))) { + callee_number = tech_pvt->caller_profile->destination_number; + } + + return switch_core_session_sprintf(tech_pvt->session, "P-Asserted-Identity: \"%s\" <%s>", callee_name, callee_number); +} + /* map QSIG cause codes to SIP from RFC4497 section 8.4.1 */ static int hangup_cause_to_sip(switch_call_cause_t cause) { @@ -523,7 +539,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return status; } - + sofia_glue_set_local_sdp(tech_pvt, NULL, 0, NULL, 0); if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); @@ -555,6 +571,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) nua_respond(tech_pvt->nh, SIP_200_OK, NUTAG_AUTOANSWER(0), TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)), + SIPTAG_HEADER_STR(generate_pai_str(session)), NUTAG_SESSION_TIMER(session_timeout), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")), @@ -1231,8 +1248,17 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi { if (!switch_strlen_zero(msg->string_arg)) { char message[256] = ""; - snprintf(message, sizeof(message), "From:\r\nTo: \"%s\"\r\n", msg->string_arg); - nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), SIPTAG_PAYLOAD_STR(message), TAG_END()); + const char *ua = switch_channel_get_variable(tech_pvt->channel, "sip_user_agent"); + + if (ua && switch_stristr("snom", ua)) { + snprintf(message, sizeof(message), "From:\r\nTo: \"%s\"\r\n", msg->string_arg); + nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), SIPTAG_PAYLOAD_STR(message), TAG_END()); + } else { + snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", msg->string_arg, tech_pvt->caller_profile->destination_number); + nua_update(tech_pvt->nh, + TAG_IF(!switch_strlen_zero(message), SIPTAG_HEADER_STR(message)), + TAG_END()); + } } } break; @@ -1387,7 +1413,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi case SWITCH_MESSAGE_INDICATE_RINGING: if (!switch_channel_test_flag(channel, CF_RING_READY) && !sofia_test_flag(tech_pvt, TFLAG_BYE) && !switch_channel_test_flag(channel, CF_EARLY_MEDIA) && !switch_channel_test_flag(channel, CF_ANSWERED)) { - nua_respond(tech_pvt->nh, SIP_180_RINGING, SIPTAG_CONTACT_STR(tech_pvt->reply_contact), TAG_END()); + nua_respond(tech_pvt->nh, SIP_180_RINGING, SIPTAG_CONTACT_STR(tech_pvt->reply_contact), SIPTAG_HEADER_STR(generate_pai_str(session)), TAG_END()); switch_channel_mark_ring_ready(channel); } break; @@ -1463,6 +1489,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi SIP_183_SESSION_PROGRESS, NUTAG_AUTOANSWER(0), TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)), + SIPTAG_HEADER_STR(generate_pai_str(session)), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 09f329d0e8..986d4e5931 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -5050,23 +5050,29 @@ static void sofia_info_send_sipfrag(switch_core_session_t *aleg, switch_core_ses switch_channel_t *channel = switch_core_session_get_channel(bleg); const char *ua = switch_channel_get_variable(channel, "sip_user_agent"); - if (ua && !switch_stristr("snom", ua)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "If you were using a Snom phone, we would have updated the caller id display on your phone for you!\n"); - return; - } - a_tech_pvt = (private_object_t *) switch_core_session_get_private(aleg); b_tech_pvt = (private_object_t *) switch_core_session_get_private(bleg); if (b_tech_pvt && a_tech_pvt && a_tech_pvt->caller_profile) { switch_caller_profile_t *acp = a_tech_pvt->caller_profile; - - if (switch_strlen_zero(acp->caller_id_name)) { - snprintf(message, sizeof(message), "From:\r\nTo: %s\r\n", acp->caller_id_number); + + if (ua && switch_stristr("snom", ua)) { + if (switch_strlen_zero(acp->caller_id_name)) { + snprintf(message, sizeof(message), "From:\r\nTo: %s\r\n", acp->caller_id_number); + } else { + snprintf(message, sizeof(message), "From:\r\nTo: \"%s\" %s\r\n", acp->caller_id_name, acp->caller_id_number); + } + nua_info(b_tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), SIPTAG_PAYLOAD_STR(message), TAG_END()); } else { - snprintf(message, sizeof(message), "From:\r\nTo: \"%s\" %s\r\n", acp->caller_id_name, acp->caller_id_number); + if (switch_strlen_zero(acp->caller_id_name)) { + snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", acp->caller_id_number, acp->caller_id_number); + } else { + snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", acp->caller_id_name, acp->caller_id_number); + } + nua_update(b_tech_pvt->nh, + TAG_IF(!switch_strlen_zero(message), SIPTAG_HEADER_STR(message)), + TAG_END()); } - nua_info(b_tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), SIPTAG_PAYLOAD_STR(message), TAG_END()); } } }