]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
initial blind crack at passing reinvites across no-media bridges
authorAnthony Minessale <anthony.minessale@gmail.com>
Wed, 19 Sep 2007 18:24:47 +0000 (18:24 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Wed, 19 Sep 2007 18:24:47 +0000 (18:24 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5718 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/sofia.c

index 8a41722c60c67090e7d81ff6425e19e4dc967d00..21c332797dd74f4aa80b042ce18927f636c068d0 100644 (file)
@@ -387,6 +387,7 @@ typedef enum {
        SWITCH_MESSAGE_INDICATE_REDIRECT  - indicate redirect
        SWITCH_MESSAGE_INDICATE_REJECT    - indicate reject
        SWITCH_MESSAGE_INDICATE_BROADCAST - indicate media broadcast
+       SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT - indicate media broadcast
 </pre>
  */
 typedef enum {
@@ -404,7 +405,8 @@ typedef enum {
        SWITCH_MESSAGE_INDICATE_UNHOLD,
        SWITCH_MESSAGE_INDICATE_REDIRECT,
        SWITCH_MESSAGE_INDICATE_REJECT,
-       SWITCH_MESSAGE_INDICATE_BROADCAST
+       SWITCH_MESSAGE_INDICATE_BROADCAST,
+       SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT
 } switch_core_session_message_types_t;
 
 
index 8e487262490b307ff6029012ba99644b929b434d..ab5b2d1b47c4b16396e1e53a9ffe35ed33b811d8 100644 (file)
@@ -689,7 +689,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                switch_channel_mark_answered(channel);
        }
                break;
-       case SWITCH_MESSAGE_INDICATE_NOMEDIA: {
+       case SWITCH_MESSAGE_INDICATE_NOMEDIA: 
+               {
                        char *uuid;
                        switch_core_session_t *other_session;
                        switch_channel_t *other_channel;
@@ -715,16 +716,26 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                                sofia_glue_tech_absorb_sdp(tech_pvt);
                        }
                        sofia_glue_do_invite(session);
-       }
+               }
                break;
-       case SWITCH_MESSAGE_INDICATE_MEDIA:{
-               uint32_t count = 0;
 
-               if (switch_channel_get_state(channel) >= CS_HANGUP) {
-                       return SWITCH_STATUS_FALSE;
+       case SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT:
+               {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending media re-direct:\n%s\n", msg->string_arg);
+                       tech_pvt->local_sdp_str = switch_core_session_strdup(session, msg->string_arg);
+                       sofia_glue_do_invite(session);
                }
+               break;
+
+       case SWITCH_MESSAGE_INDICATE_MEDIA:
+               {
+                       uint32_t count = 0;
 
-               switch_channel_clear_flag(channel, CF_BYPASS_MEDIA);
+                       if (switch_channel_get_state(channel) >= CS_HANGUP) {
+                               return SWITCH_STATUS_FALSE;
+                       }
+
+                       switch_channel_clear_flag(channel, CF_BYPASS_MEDIA);
                        tech_pvt->local_sdp_str = NULL;
                        if (!switch_rtp_ready(tech_pvt->rtp_session)) {
                                sofia_glue_tech_prepare_codecs(tech_pvt);
@@ -751,13 +762,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                }
                break;
 
-       case SWITCH_MESSAGE_INDICATE_HOLD:{
+       case SWITCH_MESSAGE_INDICATE_HOLD:
+               {
                        switch_set_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
                        sofia_glue_do_invite(session);
                }
                break;
-
-       case SWITCH_MESSAGE_INDICATE_UNHOLD:{
+               
+       case SWITCH_MESSAGE_INDICATE_UNHOLD:
+               {
                        switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
                        sofia_glue_do_invite(session);
                }
index aa4f6f3d6c1a39b4b1256da2b19001260ea5044c..437bb08687631b098b4f4c87770085056c8ccf97 100644 (file)
@@ -1210,6 +1210,19 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
 
                        if (r_sdp) { 
                                if (switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) {
+                                       if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
+                                               && (other_session = switch_core_session_locate(uuid))) {
+                                               switch_core_session_message_t msg = { 0 };
+
+                                               msg.message_id = SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT;
+                                               msg.from = __FILE__;
+                                               msg.string_arg = (char *) r_sdp;
+                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Passing SDP to other leg.\n%s\n", r_sdp);
+                                               switch_core_session_receive_message(other_session, &msg);
+                                               switch_core_session_rwunlock(other_session);
+                                       } else {
+                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Re-INVITE to a no-media channel that is not in a bridge.\n");
+                                       }
                                        goto done;
                                } else {
                                        if (tech_pvt->num_codecs) {