diff options
Diffstat (limited to 'pjsip/src/pjsip-ua/sip_inv.c')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index 0c08f076..73bbf3d5 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -162,6 +162,7 @@ struct tsx_inv_data pj_bool_t retrying; /* Resend (e.g. due to 401/407) */ pj_str_t done_tag; /* To tag in RX response with answer */ pj_bool_t done_early;/* Negotiation was done for early med? */ + pj_bool_t has_sdp; /* Message with SDP? */ }; /* @@ -713,6 +714,40 @@ static void mod_inv_on_tsx_state(pjsip_transaction *tsx, pjsip_event *e) } } +/* + * Check if tx_data has sdp. + */ +static pj_bool_t tx_data_has_sdp(const pjsip_tx_data *tdata) +{ + pjsip_msg_body *body = tdata->msg->body; + pjsip_media_type app_sdp; + + PJ_ASSERT_RETURN(tdata, PJ_FALSE); + + pjsip_media_type_init2(&app_sdp, "application", "sdp"); + + if (body && + pj_stricmp(&body->content_type.type, &app_sdp.type)==0 && + pj_stricmp(&body->content_type.subtype, &app_sdp.subtype)==0) + { + return PJ_TRUE; + + } else if (body && + pj_stricmp2(&body->content_type.type, "multipart") && + (pj_stricmp2(&body->content_type.subtype, "mixed")==0 || + pj_stricmp2(&body->content_type.subtype, "alternative")==0)) + { + pjsip_multipart_part *part; + + part = pjsip_multipart_find_part(body, &app_sdp, NULL); + if (part) { + return PJ_TRUE; + } + } + + return PJ_FALSE; +} + /* * Initialize the invite module. @@ -1495,6 +1530,7 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, /* Attach our data to the transaction. */ tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL); inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; /* Create 100rel handler */ @@ -1851,6 +1887,7 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv, if (tsx_inv_data == NULL) { tsx_inv_data = PJ_POOL_ZALLOC_T(tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL); tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; } @@ -3058,6 +3095,7 @@ PJ_DEF(pj_status_t) pjsip_inv_send_msg( pjsip_inv_session *inv, /* Associate our data in outgoing invite transaction */ tsx_inv_data = PJ_POOL_ZALLOC_T(inv->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = tx_data_has_sdp(tdata); pjsip_dlg_dec_lock(inv->dlg); @@ -3493,7 +3531,7 @@ static pj_bool_t inv_handle_update_response( pjsip_inv_session *inv, if (pjmedia_sdp_neg_get_state(inv->neg) == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE && - !tsx_inv_data->retrying) + !tsx_inv_data->retrying && tsx_inv_data->has_sdp) { pjmedia_sdp_neg_cancel_offer(inv->neg); @@ -3569,6 +3607,7 @@ static void inv_respond_incoming_prack(pjsip_inv_session *inv, tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = PJ_TRUE; inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; } |