diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-06-20 10:03:46 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-06-20 10:03:46 +0000 |
commit | a73bec4fabd296d54db391af0a29a97c5a149e2a (patch) | |
tree | 053eb1a8c0deae0ae278883e4b6d592a262dd1c1 /pjsip/src/pjsip-ua | |
parent | ff591488bfa7b642ae00ab48cff03129f6c71ae1 (diff) |
More on ticket #399: a)send full offer on 200/OK response when re-INVITE does not have SDP, b) added on_create_offer() callback, c) handle some error cases
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1379 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsip-ua')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index 984501f6..c26c8bce 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -1225,8 +1225,13 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv, /* MUST NOT do multiple SDP offer/answer in a single transaction. */ - if (tsx_inv_data->sdp_done) + if (tsx_inv_data->sdp_done) { + if (rdata->msg_info.msg->body) { + PJ_LOG(4,(inv->obj_name, "SDP negotiation done, message " + "body is ignored")); + } return PJ_SUCCESS; + } /* Check if SDP is present in the message. */ @@ -1383,11 +1388,19 @@ static pj_status_t process_answer( pjsip_inv_session *inv, } else if (neg_state == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO && pjmedia_sdp_neg_has_local_answer(inv->neg) ) { + struct tsx_inv_data *tsx_inv_data; + + /* Get invite session's transaction data */ + tsx_inv_data = (struct tsx_inv_data*) + inv->invite_tsx->mod_data[mod_inv.mod.id]; status = inv_negotiate_sdp(inv); if (status != PJ_SUCCESS) return status; + /* Mark this transaction has having SDP offer/answer done. */ + tsx_inv_data->sdp_done = 1; + status = pjmedia_sdp_neg_get_active_local(inv->neg, &sdp); } } @@ -2503,12 +2516,33 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) if (rdata->msg_info.msg->body != NULL) { status = process_answer(inv, 200, tdata, NULL); } else { - const pjmedia_sdp_session *active_sdp; - status = pjmedia_sdp_neg_send_local_offer(dlg->pool, - inv->neg, - &active_sdp); - if (status == PJ_SUCCESS) { - tdata->msg->body = create_sdp_body(tdata->pool, active_sdp); + /* INVITE does not have SDP. + * If on_create_offer() callback is implemented, ask app. + * to generate an offer, otherwise just send active local + * SDP to signal that nothing gets modified. + */ + pjmedia_sdp_session *sdp = NULL; + + if (mod_inv.cb.on_create_offer) { + (*mod_inv.cb.on_create_offer)(inv, &sdp); + if (sdp) { + status = pjmedia_sdp_neg_modify_local_offer(dlg->pool, + inv->neg, + sdp); + } + } + + if (sdp == NULL) { + const pjmedia_sdp_session *active_sdp = NULL; + status = pjmedia_sdp_neg_send_local_offer(dlg->pool, + inv->neg, + &active_sdp); + if (status == PJ_SUCCESS) + sdp = (pjmedia_sdp_session*) active_sdp; + } + + if (sdp) { + tdata->msg->body = create_sdp_body(tdata->pool, sdp); } } @@ -2604,6 +2638,16 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) */ inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); + + } else if (tsx->status_code >= 300 && tsx->status_code < 700) { + + pjmedia_sdp_neg_state neg_state; + + /* Outgoing INVITE transaction has failed, cancel SDP nego */ + neg_state = pjmedia_sdp_neg_get_state(inv->neg); + if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) { + pjmedia_sdp_neg_cancel_offer(inv->neg); + } } } } |