summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2014-02-28 05:42:24 +0000
committerLiong Sauw Ming <ming@teluu.com>2014-02-28 05:42:24 +0000
commitbe02640037da238e49a21244ba42c11a3877fb9a (patch)
tree05e10465c60b5d0e529f34d74ea1b3611e024ca7
parent4f25cc42af6561d0b9a759526a6ea97499edb8ae (diff)
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
-rw-r--r--pjsip/include/pjsip/sip_transport.h8
-rw-r--r--pjsip/src/pjsip/sip_transport.c24
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);
}