]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix invalid one legged xfer
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 29 Sep 2008 15:15:53 +0000 (15:15 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 29 Sep 2008 15:15:53 +0000 (15:15 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9734 d0543943-73ff-0310-b7d9-9358b9ac24b2

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

index 53382aa668bbb7540ca012a43cabece51b2e6bdc..bae4e40e106d620dbe11939567312b2620c51ea9 100644 (file)
@@ -926,7 +926,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                }
                break;
        case SWITCH_MESSAGE_INDICATE_BRIDGE:
-
+#if 0
                if (switch_test_flag(tech_pvt, TFLAG_XFER)) {
                        switch_clear_flag_locked(tech_pvt, TFLAG_XFER);
                        if (msg->pointer_arg) {
@@ -935,7 +935,6 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                                if ((a_session = switch_core_session_locate(tech_pvt->xferto))) {
                                        private_object_t *a_tech_pvt = switch_core_session_get_private(a_session);
                                        private_object_t *b_tech_pvt = switch_core_session_get_private(b_session);
-
                                        switch_set_flag_locked(a_tech_pvt, TFLAG_REINVITE);
                                        a_tech_pvt->remote_sdp_audio_ip = switch_core_session_strdup(a_session, b_tech_pvt->remote_sdp_audio_ip);
                                        a_tech_pvt->remote_sdp_audio_port = b_tech_pvt->remote_sdp_audio_port;
@@ -953,6 +952,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                                goto end;
                        }
                }
+#endif
+
                /*
                   if (tech_pvt->rtp_session && switch_test_flag(tech_pvt, TFLAG_TIMER)) {
                   switch_rtp_clear_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
index 1078f6ced3f76906bb0382f6448ba9bb0e969047..d755fffb0e7e7ec6ba70e2346bfaa922fff4b1c6 100644 (file)
@@ -2920,12 +2920,15 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
                                                br_a = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE);
                                                br_b = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE);
 
-                                               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, *tmp = NULL;
-                                                       
+                                               
+                                                       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 ((profile->media_options & MEDIA_OPT_BYPASS_AFTER_ATT_XFER) && (tmp = switch_core_session_locate(br_b))) {
                                                                switch_channel_t *tchannel = switch_core_session_get_channel(tmp);
                                                                switch_channel_set_variable(tchannel, SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE, "true");
@@ -2953,6 +2956,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
                                                        }
                                                } else {
                                                        if (!br_a && !br_b) {
+#if 0
                                                                switch_set_flag_locked(tech_pvt, TFLAG_NOHUP);
                                                                switch_set_flag_locked(b_tech_pvt, TFLAG_XFER);
                                                                b_tech_pvt->xferto = switch_core_session_strdup(b_session, switch_core_session_get_uuid(session));
@@ -2962,6 +2966,14 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
                                                                                   SIPTAG_CONTENT_TYPE_STR("message/sipfrag"),
                                                                                   NUTAG_SUBSTATE(nua_substate_terminated),
                                                                                   SIPTAG_PAYLOAD_STR("SIP/2.0 200 OK"), SIPTAG_EVENT_STR(etmp), TAG_END());
+#endif
+
+                                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot transfer channels that are not in a bridge.\n");
+                                                               nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag"),
+                                                                                  NUTAG_SUBSTATE(nua_substate_terminated),
+                                                                                  SIPTAG_PAYLOAD_STR("SIP/2.0 403 Forbidden"), SIPTAG_EVENT_STR(etmp), TAG_END());
+
+                                                               
                                                        } else {
                                                                switch_core_session_t *t_session;
                                                                switch_channel_t *hup_channel;