MODENDP-65 sip info frag to update display after attended transfer

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7061 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Brian West 2008-01-02 17:06:07 +00:00
parent 78c21a4772
commit 6d265b1968
1 changed files with 43 additions and 0 deletions

View File

@ -50,6 +50,8 @@ extern su_log_t sresolv_log[];
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 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
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 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
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 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
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 @@ void sofia_handle_sip_i_options(int status,
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());
}
}
}