diff options
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 17 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 33 |
2 files changed, 42 insertions, 8 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 8b695adf..d390009e 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -645,7 +645,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) 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 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) /* 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 3d13f2eb..3150d977 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -142,6 +142,8 @@ PJ_DEF(void) pjsua_msg_data_init(pjsua_msg_data *msg_data) { 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 @@ void pjsua_process_msg_data(pjsip_tx_data *tdata, &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; + } } |