From b35ac6b3bd5c970eeeb0239fe4e174f4a1799ee5 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Thu, 29 Nov 2012 18:34:27 -0600
Subject: [PATCH] fix auto_simplify

---
 src/mod/endpoints/mod_sofia/mod_sofia.c  |  9 ++++++---
 src/mod/endpoints/mod_sofia/mod_sofia.h  |  2 +-
 src/mod/endpoints/mod_sofia/sofia_glue.c | 17 +++++++++++------
 3 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index f483321e36..73c50565fe 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -1097,8 +1097,9 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
 
 
 		if (sofia_test_flag(tech_pvt, TFLAG_SIMPLIFY) && sofia_test_flag(tech_pvt, TFLAG_GOT_ACK)) {
-			sofia_glue_tech_simplify(tech_pvt);
-			sofia_clear_flag(tech_pvt, TFLAG_SIMPLIFY);
+			if (sofia_glue_tech_simplify(tech_pvt)) {
+				sofia_clear_flag(tech_pvt, TFLAG_SIMPLIFY);
+			}
 		}
 
 		while (sofia_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) {
@@ -1714,7 +1715,9 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 
 			switch_channel_set_variable(channel, SOFIA_REPLACES_HEADER, NULL);
 
-			sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY);
+			if (switch_true(switch_channel_get_variable(tech_pvt->channel, "sip_auto_simplify"))) {
+				sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY);
+			}
 
 			
 			if (switch_rtp_ready(tech_pvt->rtp_session)) {
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h
index 44f17a320f..146ef4fd44 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.h
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.h
@@ -1191,7 +1191,7 @@ uint32_t sofia_reg_reg_count(sofia_profile_t *profile, const char *user, const c
 void sofia_glue_copy_t38_options(switch_t38_options_t *t38_options, switch_core_session_t *session);
 switch_t38_options_t *sofia_glue_extract_t38_options(switch_core_session_t *session, const char *r_sdp);
 char *sofia_glue_get_multipart(switch_core_session_t *session, const char *prefix, const char *sdp, char **mp_type);
-void sofia_glue_tech_simplify(private_object_t *tech_pvt);
+int sofia_glue_tech_simplify(private_object_t *tech_pvt);
 switch_console_callback_match_t *sofia_reg_find_reg_url_multi(sofia_profile_t *profile, const char *user, const char *host);
 switch_console_callback_match_t *sofia_reg_find_reg_url_with_positive_expires_multi(sofia_profile_t *profile, const char *user, const char *host, time_t reg_time, const char *contact_str, long exptime);
 switch_bool_t sofia_glue_profile_exists(const char *key);
diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c
index 388e647cc0..efdce9449e 100644
--- a/src/mod/endpoints/mod_sofia/sofia_glue.c
+++ b/src/mod/endpoints/mod_sofia/sofia_glue.c
@@ -6785,21 +6785,19 @@ switch_status_t sofia_glue_send_notify(sofia_profile_t *profile, const char *use
 }
 
 
-void sofia_glue_tech_simplify(private_object_t *tech_pvt)
+int sofia_glue_tech_simplify(private_object_t *tech_pvt)
 {
 	const char *uuid, *network_addr_a = NULL, *network_addr_b = NULL, *simplify, *simplify_other_channel;
 	switch_channel_t *other_channel = NULL, *inbound_channel = NULL;
 	switch_core_session_t *other_session = NULL, *inbound_session = NULL;
 	uint8_t did_simplify = 0;
+	int r = 0;
 
 	if (!switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED) || switch_channel_test_flag(tech_pvt->channel, CF_SIMPLIFY)) {
-		return;
+		goto end;
 	}
 
-
-
-	if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel))
-		&& (other_session = switch_core_session_locate(uuid))) {
+	if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel)) && (other_session = switch_core_session_locate(uuid))) {
 
 		other_channel = switch_core_session_get_channel(other_session);
 
@@ -6807,6 +6805,8 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
 			simplify = switch_channel_get_variable(tech_pvt->channel, "sip_auto_simplify");
 			simplify_other_channel = switch_channel_get_variable(other_channel, "sip_auto_simplify");
 
+			r = 1;
+
 			if (switch_true(simplify) && !switch_channel_test_flag(tech_pvt->channel, CF_BRIDGE_ORIGINATOR)) {
 				network_addr_a = switch_channel_get_variable(tech_pvt->channel, "network_addr");
 				network_addr_b = switch_channel_get_variable(other_channel, "network_addr");
@@ -6851,6 +6851,11 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
 
 		switch_core_session_rwunlock(other_session);
 	}
+
+
+ end:
+
+	return r;
 }
 
 void sofia_glue_pause_jitterbuffer(switch_core_session_t *session, switch_bool_t on)