Revision
16250
Author
anthm
Date
2010-01-11 18:05:11 -0600 (Mon, 11 Jan 2010)

Log Message

SFSIP-195

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h (16249 => 16250)


--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	2010-01-11 21:27:41 UTC (rev 16249)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	2010-01-12 00:05:11 UTC (rev 16250)
@@ -579,6 +579,7 @@
 	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;

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (16249 => 16250)


--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	2010-01-11 21:27:41 UTC (rev 16249)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	2010-01-12 00:05:11 UTC (rev 16250)
@@ -3412,6 +3412,11 @@
 
 		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 @@
 			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 @@
 	}
 
 	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 */

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (16249 => 16250)


--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	2010-01-11 21:27:41 UTC (rev 16249)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	2010-01-12 00:05:11 UTC (rev 16250)
@@ -1817,7 +1817,10 @@
 				   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 @@
 				   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);