Implemented core multipart support and support in the invite session (re #1070)
 - incoming multipart message will be handled automatically
 - for testing, enable HAVE_MULTIPART_TEST in pjsua_app.c


git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@3243 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 8b695ad..d390009 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -645,7 +645,7 @@
     pjsua_call *call;
     int call_id = -1;
     int sip_err_code;
-    pjmedia_sdp_session *offer, *answer;
+    pjmedia_sdp_session *offer=NULL, *answer;
     pj_status_t status;
 
     /* Don't want to handle anything but INVITE */
@@ -765,13 +765,14 @@
 
     /* Parse SDP from incoming request */
     if (rdata->msg_info.msg->body) {
-	status = pjmedia_sdp_parse(rdata->tp_info.pool, 
-				   (char*)rdata->msg_info.msg->body->data,
-				   rdata->msg_info.msg->body->len, &offer);
-	if (status == PJ_SUCCESS) {
-	    /* Validate */
-	    status = pjmedia_sdp_validate(offer);
-	}
+	pjsip_rdata_sdp_info *sdp_info;
+
+	sdp_info = pjsip_rdata_get_sdp_info(rdata);
+	offer = sdp_info->sdp;
+
+	status = sdp_info->sdp_err;
+	if (status==PJ_SUCCESS && sdp_info->sdp==NULL)
+	    status = PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_NOT_ACCEPTABLE);
 
 	if (status != PJ_SUCCESS) {
 	    const pj_str_t reason = pj_str("Bad SDP");
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 3d13f2e..3150d97 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -142,6 +142,8 @@
 {
     pj_bzero(msg_data, sizeof(*msg_data));
     pj_list_init(&msg_data->hdr_list);
+    pjsip_media_type_init(&msg_data->multipart_ctype, NULL, NULL);
+    pj_list_init(&msg_data->multipart_parts);
 }
 
 PJ_DEF(void) pjsua_transport_config_default(pjsua_transport_config *cfg)
@@ -2225,6 +2227,37 @@
 				     &msg_data->msg_body);
 	tdata->msg->body = body;
     }
+
+    /* Multipart */
+    if (!pj_list_empty(&msg_data->multipart_parts) &&
+	msg_data->multipart_ctype.type.slen)
+    {
+	pjsip_msg_body *bodies;
+	pjsip_multipart_part *part;
+	pj_str_t *boundary = NULL;
+
+	bodies = pjsip_multipart_create(tdata->pool,
+				        &msg_data->multipart_ctype,
+				        boundary);
+	part = msg_data->multipart_parts.next;
+	while (part != &msg_data->multipart_parts) {
+	    pjsip_multipart_part *part_copy;
+
+	    part_copy = pjsip_multipart_clone_part(tdata->pool, part);
+	    pjsip_multipart_add_part(tdata->pool, bodies, part_copy);
+	    part = part->next;
+	}
+
+	if (tdata->msg->body) {
+	    part = pjsip_multipart_create_part(tdata->pool);
+	    part->body = tdata->msg->body;
+	    pjsip_multipart_add_part(tdata->pool, bodies, part);
+
+	    tdata->msg->body = NULL;
+	}
+
+	tdata->msg->body = bodies;
+    }
 }