diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-02-10 14:04:05 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-02-10 14:04:05 +0000 |
commit | bb9a7993790bd9aac174bf8f08344dbb16ad7aa1 (patch) | |
tree | 88db34634560ae7427b7a2ad0681bb7fbaf44a85 /pjsip/src/pjsip-ua/sip_inv.c | |
parent | 313201cc693799d8f64186f63f5865e0ab35dcd0 (diff) |
Added more logging, and fixed bug when ACK is responded!
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@175 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsip-ua/sip_inv.c')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index fede7da6..652f81c4 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -130,7 +130,7 @@ void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state, (*mod_inv.cb.on_state_changed)(inv, e); if (inv->state == PJSIP_INV_STATE_DISCONNECTED) - pjsip_dlg_dec_session(inv->dlg); + pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); } @@ -142,6 +142,9 @@ static pj_status_t inv_send_ack(pjsip_inv_session *inv, pjsip_rx_data *rdata) pjsip_tx_data *tdata; pj_status_t status; + PJ_LOG(5,(inv->obj_name, "Received %s, sending ACK", + pjsip_rx_data_get_info(rdata))); + status = pjsip_dlg_create_request(inv->dlg, &pjsip_ack_method, rdata->msg_info.cseq->cseq, &tdata); if (status != PJ_SUCCESS) { @@ -370,6 +373,9 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uac( pjsip_dialog *dlg, inv->dlg = dlg; inv->options = options; + /* Object name will use the same dialog pointer. */ + pj_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); + /* Create negotiator if local_sdp is specified. */ if (local_sdp) { status = pjmedia_sdp_neg_create_w_local_offer(dlg->pool, local_sdp, @@ -384,10 +390,14 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uac( pjsip_dialog *dlg, return status; /* Increment dialog session */ - pjsip_dlg_inc_session(dlg); + pjsip_dlg_inc_session(dlg, &mod_inv.mod); /* Done */ *p_inv = inv; + + PJ_LOG(5,(inv->obj_name, "UAC invite session created for dialog %s", + dlg->obj_name)); + return PJ_SUCCESS; } @@ -759,6 +769,9 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, inv->dlg = dlg; inv->options = options; + /* Object name will use the same dialog pointer. */ + pj_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); + /* Parse SDP in message body, if present. */ if (msg->body) { pjsip_msg_body *body = msg->body; @@ -794,7 +807,7 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, return status; /* Increment session in the dialog. */ - pjsip_dlg_inc_session(dlg); + pjsip_dlg_inc_session(dlg, &mod_inv.mod); /* Save the invite transaction. */ inv->invite_tsx = pjsip_rdata_get_tsx(rdata); @@ -807,6 +820,10 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, /* Done */ *p_inv = inv; + + PJ_LOG(5,(inv->obj_name, "UAS invite session created for dialog %s", + dlg->obj_name)); + return PJ_SUCCESS; } @@ -912,6 +929,8 @@ static pj_status_t inv_negotiate_sdp( pjsip_inv_session *inv ) status = pjmedia_sdp_neg_negotiate(inv->pool, inv->neg, 0); + PJ_LOG(5,(inv->obj_name, "SDP negotiation done, status=%d", status)); + if (mod_inv.cb.on_media_update) (*mod_inv.cb.on_media_update)(inv, status); @@ -981,6 +1000,9 @@ static void inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv, /* This is an offer. */ + PJ_LOG(5,(inv->obj_name, "Got SDP offer in %s", + pjsip_rx_data_get_info(rdata))); + if (inv->neg == NULL) { status=pjmedia_sdp_neg_create_w_remote_offer(inv->pool, NULL, sdp, &inv->neg); @@ -1009,6 +1031,9 @@ static void inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv, * Process and negotiate remote answer. */ + PJ_LOG(5,(inv->obj_name, "Got SDP answer in %s", + pjsip_rx_data_get_info(rdata))); + status = pjmedia_sdp_neg_set_remote_answer(inv->pool, inv->neg, sdp); if (status != PJ_SUCCESS) { @@ -1260,6 +1285,9 @@ PJ_DEF(pj_status_t) pjsip_inv_send_msg( pjsip_inv_session *inv, /* Verify arguments. */ PJ_ASSERT_RETURN(inv && tdata, PJ_EINVAL); + PJ_LOG(5,(inv->obj_name, "Sending %s", + pjsip_tx_data_get_info(tdata))); + if (tdata->msg->type == PJSIP_REQUEST_MSG) { pjsip_transaction *tsx; struct tsx_inv_data *tsx_inv_data; @@ -1581,6 +1609,23 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e) default: break; } + + } else if (inv->role == PJSIP_ROLE_UAC && + tsx->role == PJSIP_ROLE_UAC && + tsx->method.id == PJSIP_CANCEL_METHOD) + { + /* + * Handle case when outgoing CANCEL is answered with 481 (Call/ + * Transaction Does Not Exist), 408, or when it's timed out. In these + * cases, disconnect session (i.e. dialog usage only). + */ + if (tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST || + tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || + tsx->status_code == PJSIP_SC_TSX_TIMEOUT || + PJSIP_SC_TSX_TRANSPORT_ERROR) + { + inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); + } } } @@ -1737,6 +1782,22 @@ static void inv_on_state_early( pjsip_inv_session *inv, pjsip_event *e) inv_respond_incoming_cancel(inv, tsx, e->body.tsx_state.src.rdata); + } else if (inv->role == PJSIP_ROLE_UAC && + tsx->role == PJSIP_ROLE_UAC && + tsx->method.id == PJSIP_CANCEL_METHOD) + { + /* + * Handle case when outgoing CANCEL is answered with 481 (Call/ + * Transaction Does Not Exist), 408, or when it's timed out. In these + * cases, disconnect session (i.e. dialog usage only). + */ + if (tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST || + tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || + tsx->status_code == PJSIP_SC_TSX_TIMEOUT || + PJSIP_SC_TSX_TRANSPORT_ERROR) + { + inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); + } } } |