summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2010-08-01 09:48:51 +0000
committerBenny Prijono <bennylp@teluu.com>2010-08-01 09:48:51 +0000
commit059d687249f0f95e0b30785c418e1aa47555615a (patch)
tree792e10acf82954faca0a2b7fe937064a1ecb81d8 /pjsip/src/pjsua-lib
parent1426b8301e4d99837bd70ce73b350d03fafbfd45 (diff)
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: http://svn.pjsip.org/repos/pjproject/trunk@3243 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c17
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c33
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;
+ }
}