]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
SFSIP-195
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 12 Jan 2010 00:05:11 +0000 (00:05 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 12 Jan 2010 00:05:11 +0000 (00:05 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16250 d0543943-73ff-0310-b7d9-9358b9ac24b2

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

index 0a811ed6a45d3e732da110efdf11392cfae4b187..956b446a3d80b9a63f265d4c063950eb283ce9cb 100644 (file)
@@ -579,6 +579,7 @@ struct private_object {
        switch_rtp_crypto_key_type_t crypto_recv_type;
        switch_rtp_crypto_key_type_t crypto_type;
        char *local_sdp_str;
+       char *last_sdp_str;
        char *dest;
        char *dest_to;
        char *key;
index ea58353e46c2b472c894c9e09ccb788de1f5e772..e41d7a2e4c48ebb171113794e837296243ccd44e 100644 (file)
@@ -3412,6 +3412,11 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
 
                switch_channel_clear_flag(channel, CF_REQ_MEDIA);
 
+               tech_pvt->last_sdp_str = NULL;
+               if (!sofia_use_soa(tech_pvt) && sip->sip_payload && sip->sip_payload->pl_data) {
+                       tech_pvt->last_sdp_str = switch_core_session_strdup(session, sip->sip_payload->pl_data);
+               }
+
                if (sofia_test_pflag(profile, PFLAG_MANAGE_SHARED_APPEARANCE)) {
                        if (channel && sip->sip_call_info) {
                                char *p;
@@ -3832,6 +3837,20 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                        NUTAG_OFFER_SENT_REF(offer_sent),
                        NUTAG_ANSWER_SENT_REF(answer_sent),
                        SIPTAG_REPLACES_STR_REF(replaces_str), SOATAG_LOCAL_SDP_STR_REF(l_sdp), SOATAG_REMOTE_SDP_STR_REF(r_sdp), TAG_END());
+
+
+       if (session) {
+               channel = switch_core_session_get_channel(session);
+               tech_pvt = switch_core_session_get_private(session);
+
+               if (!tech_pvt || !tech_pvt->nh) {
+                       goto done;
+               }
+       }
+
+       if (status > 100 && status < 300 && tech_pvt && !sofia_use_soa(tech_pvt) && !r_sdp && tech_pvt->last_sdp_str) {
+               r_sdp = tech_pvt->last_sdp_str;
+       }
        
        /* This marr in our code brought to you by people who can't read........*/
        if (profile->ndlb & PFLAG_NDLB_ALLOW_BAD_IANANAME && r_sdp && (p = (char *) switch_stristr("g729a/8000", r_sdp))) {
@@ -3867,13 +3886,6 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
        }
 
        if (session) {
-               channel = switch_core_session_get_channel(session);
-               tech_pvt = switch_core_session_get_private(session);
-
-               if (!tech_pvt || !tech_pvt->nh) {
-                       goto done;
-               }
-
                if ((switch_channel_test_flag(channel, CF_EARLY_MEDIA) || switch_channel_test_flag(channel, CF_ANSWERED)) && 
                        (status == 180 || status == 183)) {
                        /* Must you send 180 after 183 w/sdp ? sheesh */
index e318877fea0aae365a984cfc3bcff8ac12164514..227ec6c5567fe702a73d6ddb7a351a223785e878 100644 (file)
@@ -1817,7 +1817,10 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
                                   SOATAG_REUSE_REJECTED(1),
                                   SOATAG_ORDERED_USER(1),
                                   SOATAG_RTP_SORT(SOA_RTP_SORT_REMOTE),
-                                  SOATAG_RTP_SELECT(SOA_RTP_SELECT_ALL), TAG_IF(rep, SIPTAG_REPLACES_STR(rep)), SOATAG_HOLD(holdstr), TAG_END());
+                                  SOATAG_RTP_SELECT(SOA_RTP_SELECT_ALL), 
+                                  TAG_IF(rep, SIPTAG_REPLACES_STR(rep)), 
+                                  SOATAG_HOLD(holdstr), 
+                                  TAG_END());
        } else {
                nua_invite(tech_pvt->nh,
                                   NUTAG_AUTOANSWER(0),
@@ -1839,7 +1842,8 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
                                   SIPTAG_CONTENT_TYPE_STR("application/sdp"),
                                   SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),
                                   TAG_IF(rep, SIPTAG_REPLACES_STR(rep)), 
-                                  TAG_END());
+                                  SOATAG_HOLD(holdstr), 
+                                  TAG_END());          
        }
 
        sofia_glue_free_destination(dst);