From 4296b5e257c12da9da1e1ddb4c5c5926421047bf Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Thu, 8 Aug 2013 22:55:34 +0500
Subject: [PATCH] FS-5682 --resolve new syntax <action application="set"
 data="sip_multipart=application/pidf+xml:1234"/> use push instead of set to
 add more to the same channel

---
 src/mod/endpoints/mod_sofia/sofia.c      | 12 ++-------
 src/mod/endpoints/mod_sofia/sofia_glue.c | 31 ++++++++++++++++++------
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index 76b9a01be0..4faea7ac42 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -8349,16 +8349,8 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
 		
 		for (mp = sip->sip_multipart; mp; mp = mp->mp_next) {
 			if (mp->mp_payload && mp->mp_payload->pl_data && mp->mp_content_type && mp->mp_content_type->c_type) {
-				char *name = switch_core_session_strdup(session, mp->mp_content_type->c_type);
-				char *p;
-
-				for (p = name; p && *p; p++) {
-					if (*p == '/') {
-						*p = '_';
-					}
-				}
-				
-				switch_channel_set_variable_name_printf(channel, mp->mp_payload->pl_data, SOFIA_MULTIPART_PREFIX "%s", name);
+				char *val = switch_core_session_sprintf(session, "%s:%s", mp->mp_content_type->c_type, mp->mp_payload->pl_data);
+				switch_channel_add_variable_var_check(channel, "sip_multipart", val, SWITCH_FALSE, SWITCH_STACK_PUSH);
 			}
 		}
 	}
diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c
index 1b1b51438d..8efaabfbba 100644
--- a/src/mod/endpoints/mod_sofia/sofia_glue.c
+++ b/src/mod/endpoints/mod_sofia/sofia_glue.c
@@ -1969,6 +1969,20 @@ void sofia_glue_tech_set_local_sdp(private_object_t *tech_pvt, const char *sdp_s
 	switch_mutex_unlock(tech_pvt->flag_mutex);
 }
 
+static void process_mp(switch_core_session_t *session, switch_stream_handle_t *stream, const char *boundary, const char *str) {
+	char *dname = switch_core_session_strdup(session, str);
+	char *dval;
+
+	if ((dval = strchr(dname, ':'))) {
+		*dval++ = '\0';
+		if (*dval == '~') {
+			stream->write_function(stream, "--%s\nContent-Type: %s\nContent-Length: %d\n%s\n", boundary, dname, strlen(dval), dval + 1);
+		} else {
+			stream->write_function(stream, "--%s\nContent-Type: %s\nContent-Length: %d\n\n%s\n", boundary, dname, strlen(dval) + 1, dval);
+		}							
+	}
+}
+
 char *sofia_glue_get_multipart(switch_core_session_t *session, const char *prefix, const char *sdp, char **mp_type)
 {
 	char *extra_headers = NULL;
@@ -1984,14 +1998,18 @@ char *sofia_glue_get_multipart(switch_core_session_t *session, const char *prefi
 			const char *name = (char *) hi->name;
 			char *value = (char *) hi->value;
 
-			if (!strncasecmp(name, prefix, strlen(prefix))) {
-				const char *hname = name + strlen(prefix);
-				if (*value == '~') {
-					stream.write_function(&stream, "--%s\nContent-Type: %s\nContent-Length: %d\n%s\n", boundary, hname, strlen(value), value + 1);
+			if (!strcasecmp(name, prefix)) {
+				if (hi->idx > 0) {
+					int i = 0;
+
+					for(i = 0; i < hi->idx; i++) {
+						process_mp(session, &stream, boundary, hi->array[i]);
+						x++;
+					}
 				} else {
-					stream.write_function(&stream, "--%s\nContent-Type: %s\nContent-Length: %d\n\n%s\n", boundary, hname, strlen(value) + 1, value);
+					process_mp(session, &stream, boundary, value);
+					x++;
 				}
-				x++;
 			}
 		}
 		switch_channel_variable_last(channel);
@@ -2014,7 +2032,6 @@ char *sofia_glue_get_multipart(switch_core_session_t *session, const char *prefi
 	return extra_headers;
 }
 
-
 char *sofia_glue_get_extra_headers(switch_channel_t *channel, const char *prefix)
 {
 	char *extra_headers = NULL;