diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-06-13 22:21:23 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-06-13 22:21:23 +0000 |
commit | 26af83c5f17911357c683761253a7b25993f321f (patch) | |
tree | 5a206ec979fbf063bd4bc0ebd4294c754d9738ac /pjsip/src/pjsip-ua/sip_inv.c | |
parent | f0bcd9121b3833df88a00d7808fc578c1bced67e (diff) |
Added status_text and cause_text in dialog and transaction to capture the real status text in the final response (instead of just the code)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@500 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 | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index 593a914e..4efb9177 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -158,6 +158,25 @@ void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state, /* + * Set cause code. + */ +void inv_set_cause(pjsip_inv_session *inv, int cause_code, + const pj_str_t *cause_text) +{ + if (cause_code > inv->cause) { + inv->cause = cause_code; + if (cause_text) + pj_strdup(inv->pool, &inv->cause_text, cause_text); + else if (cause_code/100 == 2) + inv->cause_text = pj_str("Normal call clearing"); + else + inv->cause_text = *pjsip_get_status_text(cause_code); + } +} + + + +/* * Send ACK for 2xx response. */ static pj_status_t inv_send_ack(pjsip_inv_session *inv, pjsip_rx_data *rdata) @@ -898,7 +917,7 @@ PJ_DEF(pj_status_t) pjsip_inv_terminate( pjsip_inv_session *inv, } /* Set cause. */ - inv->cause = st_code; + inv_set_cause(inv, st_code, NULL); /* Forcefully terminate the session if state is not DISCONNECTED */ if (inv->state != PJSIP_INV_STATE_DISCONNECTED) { @@ -1387,7 +1406,7 @@ PJ_DEF(pj_status_t) pjsip_inv_end_session( pjsip_inv_session *inv, PJ_ASSERT_RETURN(inv && p_tdata, PJ_EINVAL); /* Set cause code. */ - if (inv->cause==0) inv->cause = st_code; + inv_set_cause(inv, st_code, st_text); /* Create appropriate message. */ switch (inv->state) { @@ -1697,7 +1716,7 @@ static void inv_respond_incoming_bye( pjsip_inv_session *inv, /* Terminate session: */ if (inv->state != PJSIP_INV_STATE_DISCONNECTED) { - if (inv->cause==0) inv->cause=PJSIP_SC_OK; + inv_set_cause(inv, PJSIP_SC_OK, NULL); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } } @@ -1713,7 +1732,7 @@ static void inv_handle_bye_response( pjsip_inv_session *inv, pj_status_t status; if (e->body.tsx_state.type != PJSIP_EVENT_RX_MSG) { - if (inv->cause==0) inv->cause=PJSIP_SC_OK; + inv_set_cause(inv, PJSIP_SC_OK, NULL); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); return; } @@ -1733,7 +1752,7 @@ static void inv_handle_bye_response( pjsip_inv_session *inv, /* Does not have proper credentials. * End the session anyway. */ - if (inv->cause==0) inv->cause=PJSIP_SC_OK; + inv_set_cause(inv, PJSIP_SC_OK, NULL); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } else { @@ -1744,7 +1763,7 @@ static void inv_handle_bye_response( pjsip_inv_session *inv, } else { /* End the session. */ - if (inv->cause==0) inv->cause=PJSIP_SC_OK; + inv_set_cause(inv, PJSIP_SC_OK, NULL); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } @@ -1862,7 +1881,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e) /* Does not have proper credentials. * End the session. */ - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } else { @@ -1877,7 +1896,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e) } else { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } @@ -1905,7 +1924,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e) } else { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } break; @@ -1926,9 +1945,9 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e) 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) + tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR) { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } } @@ -1972,7 +1991,7 @@ static void inv_on_state_incoming( pjsip_inv_session *inv, pjsip_event *e) if (tsx->status_code/100 == 2) { inv_set_state(inv, PJSIP_INV_STATE_CONNECTING, e); } else { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } break; @@ -1982,7 +2001,7 @@ static void inv_on_state_incoming( pjsip_inv_session *inv, pjsip_event *e) * This happens on transport error (e.g. failed to send * response) */ - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); break; @@ -2044,7 +2063,7 @@ static void inv_on_state_early( pjsip_inv_session *inv, pjsip_event *e) } } else { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } break; @@ -2078,7 +2097,7 @@ static void inv_on_state_early( pjsip_inv_session *inv, pjsip_event *e) } } else { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } break; @@ -2112,9 +2131,9 @@ static void inv_on_state_early( pjsip_inv_session *inv, pjsip_event *e) 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) + tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR) { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } } @@ -2148,7 +2167,7 @@ static void inv_on_state_connecting( pjsip_inv_session *inv, pjsip_event *e) * error. */ if (tsx->status_code/100 != 2) { - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } break; @@ -2340,7 +2359,7 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) /* * Handle responses that terminates dialog. */ - if (inv->cause==0) inv->cause = tsx->status_code; + inv_set_cause(inv, tsx->status_code, &tsx->status_text); inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); } } |