[Freeswitch-svn] [commit] r7061 - freeswitch/trunk/src/mod/endpoints/mod_sofia
Freeswitch SVN
brian at freeswitch.org
Wed Jan 2 12:06:07 EST 2008
Author: brian
Date: Wed Jan 2 12:06:07 2008
New Revision: 7061
Modified:
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
Log:
MODENDP-65 sip info frag to update display after attended transfer
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Wed Jan 2 12:06:07 2008
@@ -50,6 +50,8 @@
extern su_log_t stun_log[];
+static void sofia_info_send_sipfrag(switch_core_session_t *aleg, switch_core_session_t *bleg);
+
static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
char const *phrase,
nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]);
@@ -1803,6 +1805,8 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Attended Transfer [%s][%s]\n", switch_str_nil(br_a), switch_str_nil(br_b));
if (br_a && br_b) {
+ switch_core_session_t *new_b_session = NULL, *a_session = NULL;
+
switch_ivr_uuid_bridge(br_b, br_a);
switch_channel_set_variable(channel_b, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "ATTENDED_TRANSFER");
nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag"),
@@ -1810,6 +1814,15 @@
switch_clear_flag_locked(b_tech_pvt, TFLAG_SIP_HOLD);
switch_ivr_park_session(b_session);
+ new_b_session = switch_core_session_locate(br_b);
+ a_session = switch_core_session_locate(br_a);
+ sofia_info_send_sipfrag(a_session, new_b_session);
+ if(new_b_session) {
+ switch_core_session_rwunlock(new_b_session);
+ }
+ if(a_session) {
+ switch_core_session_rwunlock(a_session);
+ }
//switch_channel_hangup(channel_b, SWITCH_CAUSE_ATTENDED_TRANSFER);
} else {
if (!br_a && !br_b) {
@@ -2368,6 +2381,14 @@
switch_channel_set_variable(channel, "sip_call_id", tech_pvt->call_id);
}
+ if (!switch_strlen_zero(sip->sip_to->a_tag)) {
+ switch_channel_set_variable(channel, "sip_to_tag", sip->sip_to->a_tag);
+ }
+
+ if (!switch_strlen_zero(sip->sip_from->a_tag)) {
+ switch_channel_set_variable(channel, "sip_from_tag", sip->sip_from->a_tag);
+ }
+
if (sip->sip_subject && sip->sip_subject->g_string) {
switch_channel_set_variable(channel, "sip_subject", sip->sip_subject->g_string);
}
@@ -2604,3 +2625,25 @@
TAG_END());
nua_handle_destroy(nh);
}
+
+static void sofia_info_send_sipfrag(switch_core_session_t *aleg, switch_core_session_t *bleg)
+{
+ private_object_t *b_tech_pvt = NULL, *a_tech_pvt = NULL;
+ char message[256] = "";
+
+ if (aleg && bleg) {
+ 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);
+ } 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());
+ }
+ }
+}
More information about the Freeswitch-svn
mailing list