From be02640037da238e49a21244ba42c11a3877fb9a Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Fri, 28 Feb 2014 05:42:24 +0000 Subject: Fixed #1699: Transport state callback to report transport shutdown events (Thanks to Johan Lantz for the discussion and preliminary patch). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4773 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsip/sip_transport.h | 8 +++++++- pjsip/src/pjsip/sip_transport.c | 24 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h index 4ff3597c..eb9e4dbc 100644 --- a/pjsip/include/pjsip/sip_transport.h +++ b/pjsip/include/pjsip/sip_transport.h @@ -1388,9 +1388,15 @@ typedef enum pjsip_transport_state PJSIP_TP_STATE_CONNECTED, /**< Transport connected, applicable only to connection-oriented transports such as TCP and TLS. */ - PJSIP_TP_STATE_DISCONNECTED /**< Transport disconnected, applicable + PJSIP_TP_STATE_DISCONNECTED, /**< Transport disconnected, applicable only to connection-oriented transports such as TCP and TLS. */ + PJSIP_TP_STATE_SHUTDOWN, /**< Transport shutdown, either + due to TCP/TLS disconnect error + from the network, or when shutdown + is initiated by PJSIP itself. */ + PJSIP_TP_STATE_DESTROY, /**< Transport destroy, when transport + is about to be destroyed. */ } pjsip_transport_state; diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c index d8cfd59c..008edbcd 100644 --- a/pjsip/src/pjsip/sip_transport.c +++ b/pjsip/src/pjsip/sip_transport.c @@ -1091,6 +1091,7 @@ PJ_DEF(pj_status_t) pjsip_transport_shutdown(pjsip_transport *tp) { pjsip_tpmgr *mgr; pj_status_t status; + pjsip_tp_state_callback state_cb; TRACE_((THIS_FILE, "Transport %s shutting down", tp->obj_name)); @@ -1111,7 +1112,17 @@ PJ_DEF(pj_status_t) pjsip_transport_shutdown(pjsip_transport *tp) /* Instruct transport to shutdown itself */ if (tp->do_shutdown) status = tp->do_shutdown(tp); - + + /* Notify application of transport shutdown */ + state_cb = pjsip_tpmgr_get_state_cb(tp->tpmgr); + if (state_cb) { + pjsip_transport_state_info state_info; + + pj_bzero(&state_info, sizeof(state_info)); + state_info.status = status; + (*state_cb)(tp, PJSIP_TP_STATE_SHUTDOWN, &state_info); + } + if (status == PJ_SUCCESS) tp->is_shutdown = PJ_TRUE; @@ -1133,9 +1144,20 @@ PJ_DEF(pj_status_t) pjsip_transport_shutdown(pjsip_transport *tp) */ PJ_DEF(pj_status_t) pjsip_transport_destroy( pjsip_transport *tp) { + pjsip_tp_state_callback state_cb; + /* Must have no user. */ PJ_ASSERT_RETURN(pj_atomic_get(tp->ref_cnt) == 0, PJSIP_EBUSY); + /* Notify application of transport destroy */ + state_cb = pjsip_tpmgr_get_state_cb(tp->tpmgr); + if (state_cb) { + pjsip_transport_state_info state_info; + + pj_bzero(&state_info, sizeof(state_info)); + (*state_cb)(tp, PJSIP_TP_STATE_DESTROY, &state_info); + } + /* Destroy. */ return destroy_transport(tp->tpmgr, tp); } -- cgit v1.2.3