]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Update CID on Polycom when doing an Attended transfer, Make send_display work with...
authorBrian West <brian@freeswitch.org>
Thu, 28 May 2009 22:46:17 +0000 (22:46 +0000)
committerBrian West <brian@freeswitch.org>
Thu, 28 May 2009 22:46:17 +0000 (22:46 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13492 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/sofia.c

index ddf4c30dc9b5be024d1f9dd61829d6ae5f666040..5f88aa52b52b963c59a4813045b0b5b4a84d46ae 100644 (file)
@@ -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),
index 09f329d0e873554b805686e429a98cf7430b1f82..986d4e593160dfce4e06f33b10afb4a5041b8d48 100644 (file)
@@ -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());
                }
        }
 }